Android Kotlin中Toolbar内Logo不显示及setLogo方法异常问题求助
嘿,我来帮你搞定这个Toolbar Logo不显示的问题,还得解决调用toolbar.setLogo()后右侧图标消失的麻烦。结合你贴的代码来看,问题主要出在Toolbar内部布局和ActionBarDrawerToggle的布局冲突上,下面给你具体的解决方案:
问题原因分析
- 你在Toolbar里嵌套了一个占满宽度的LinearLayout,而ActionBarDrawerToggle会自动在Toolbar左侧添加汉堡导航图标,这个图标会和你自定义的LogoImageView布局重叠,导致Logo被遮挡。
- 调用
toolbar.setLogo()时,这个方法会替换Toolbar默认的左侧内容区域,同时干扰了Toolbar内部的布局测量逻辑,导致你右侧的自定义LinearLayout没有被正确渲染,所以图标消失了。
解决方案
方案一:调整Toolbar内部布局,避开DrawerToggle的空间
不需要嵌套外层的全屏LinearLayout,直接利用Toolbar的布局特性来放置Logo和右侧操作栏,同时给Logo留出汉堡图标的空间:
<androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.NoActionBar"> <!-- 给Logo设置marginStart,留出汉堡图标的位置(默认汉堡图标宽度约48dp) --> <ImageView android:id="@+id/logo" android:layout_width="108dp" android:layout_height="36dp" android:layout_marginStart="48dp" app:srcCompat="@drawable/logo" /> <!-- 右侧操作栏用layout_gravity="end"定位到右侧 --> <LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center_vertical" android:orientation="horizontal" android:paddingEnd="10dp" android:layout_gravity="end"> <ImageView android:id="@+id/btnOpenSearch" android:layout_width="40dp" android:layout_height="40dp" android:padding="10dp" app:tint="@color/colorText" app:srcCompat="@drawable/ic_search" /> <ImageView android:id="@+id/btnProfileImage" android:layout_width="42dp" android:layout_height="42dp" android:adjustViewBounds="true" android:padding="6dp" app:srcCompat="@drawable/ic_user" /> <TextView android:id="@+id/btnSignIn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:fontFamily="sans-serif-medium" android:padding="10dp" android:text="@string/sign_in" android:textColor="@color/colorText" android:textSize="18sp" /> </LinearLayout> </androidx.appcompat.widget.Toolbar>
方案二:使用Toolbar默认Logo属性,配合样式调整
如果你更倾向于用toolbar.setLogo()方法设置Logo,可以通过调整Toolbar的样式来避免和DrawerToggle冲突:
- 在
res/values/styles.xml中添加自定义Toolbar样式:
<style name="CustomToolbarStyle" parent="Widget.AppCompat.Toolbar"> <!-- 调整导航图标和内容的间距,给Logo留出显示空间 --> <item name="contentInsetStartWithNavigation">16dp</item> </style>
- 给Toolbar应用这个样式:
<androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.NoActionBar" style="@style/CustomToolbarStyle"> <!-- 保留右侧的操作栏布局 --> <LinearLayout android:layout_width="wrap_content" android:layout_height="match_parent" android:gravity="center_vertical" android:orientation="horizontal" android:paddingEnd="10dp" android:layout_gravity="end"> <!-- 右侧图标和TextView代码不变 --> <ImageView android:id="@+id/btnOpenSearch" android:layout_width="40dp" android:layout_height="40dp" android:padding="10dp" app:tint="@color/colorText" app:srcCompat="@drawable/ic_search" /> <ImageView android:id="@+id/btnProfileImage" android:layout_width="42dp" android:layout_height="42dp" android:adjustViewBounds="true" android:padding="6dp" app:srcCompat="@drawable/ic_user" /> <TextView android:id="@+id/btnSignIn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:fontFamily="sans-serif-medium" android:padding="10dp" android:text="@string/sign_in" android:textColor="@color/colorText" android:textSize="18sp" /> </LinearLayout> </androidx.appcompat.widget.Toolbar>
- 修改逻辑代码,先关联SupportActionBar再设置Logo:
toolbar = findViewById(R.id.toolbar) // 先设置Toolbar作为SupportActionBar setSupportActionBar(toolbar) // 隐藏默认标题,避免和Logo冲突 supportActionBar?.setDisplayShowTitleEnabled(false) drawerLayout = findViewById(R.id.drawer_layout) navView = findViewById(R.id.nav_view) // 设置Logo toolbar.setLogo(R.drawable.logo) val toggle = ActionBarDrawerToggle( this, drawerLayout, toolbar, 0, 0 ) drawerLayout.addDrawerListener(toggle) toggle.syncState() navView.setNavigationItemSelectedListener(this)
额外检查点
- 确认
@drawable/logo资源存在,且尺寸正常(没有宽高为0的情况)。 - 不要给Toolbar设置
android:contentInsetStart="0dp"这类属性,否则会挤掉Logo的空间。 - 如果使用矢量图(VectorDrawable),确保
app:srcCompat属性正确使用,且build.gradle中开启了矢量图支持:
android { defaultConfig { vectorDrawables.useSupportLibrary = true } }
内容的提问来源于stack exchange,提问作者TheGreatCornholio
相关产品推荐
相关产品推荐

