Android开发如何自定义ActionBar Logo的显示尺寸
Toolbar作为ActionBar使用时调整Logo尺寸适配栏位高度
问题场景
Android开发中将Toolbar作为ActionBar使用时,设置的Logo无法填满高度为70dp的Toolbar栏位,使用的Logo为汉堡菜单样式的drawable资源,检索公开方案未找到有效解决方法。
已实现的Java逻辑代码
private void setToolBar() { setSupportActionBar(toolbar); if (getSupportActionBar() != null) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); getSupportActionBar().setDisplayUseLogoEnabled(true); getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_menu_lang); } }
对应布局XML代码
<androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="70dp" android:background="@color/blueBack" android:elevation="4dp" app:logo="@drawable/logomch" android:paddingEnd="55dp" android:theme="@style/ThemeOverlay.AppCompat.ActionBar" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" tools:ignore="RtlSymmetry"> </androidx.appcompat.widget.Toolbar>
解决方案
别用app:logo属性或者ActionBar的setLogo()方法设置图标,系统给这套默认Logo加了固定内边距和尺寸限制,没有公开API可以修改,根本撑不满你设置的70dp高度。最稳妥的方法是直接在Toolbar内部嵌入自定义ImageView作为Logo,尺寸、边距、缩放规则完全可控:
- 第一步修改布局文件,删掉Toolbar上的
app:logo属性,在Toolbar标签内部添加自定义Logo视图:
<androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="70dp" android:background="@color/blueBack" android:elevation="4dp" android:paddingEnd="55dp" android:theme="@style/ThemeOverlay.AppCompat.ActionBar" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" tools:ignore="RtlSymmetry"> <!-- 自定义Logo视图,尺寸完全自主控制 --> <ImageView android:id="@+id/toolbar_logo" android:layout_width="70dp" android:layout_height="70dp" android:layout_gravity="start|center_vertical" android:scaleType="fitCenter" android:src="@drawable/logomch" android:contentDescription="@string/app_name"/> </androidx.appcompat.widget.Toolbar>
- 第二步调整Java代码,关闭ActionBar默认的Logo显示逻辑,避免和自定义视图冲突:
private void setToolBar() { setSupportActionBar(toolbar); if (getSupportActionBar() != null) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); // 移除原代码中的setDisplayUseLogoEnabled调用,不需要启用系统默认Logo getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_menu_lang); // 不需要默认标题的话可以打开下面这行,避免标题占位挤压自定义Logo位置 // getSupportActionBar().setDisplayShowTitleEnabled(false); } // 需要给Logo加点击事件直接绑定控件即可 // ImageView logo = findViewById(R.id.toolbar_logo); // logo.setOnClickListener(v -> { /* 自定义点击逻辑 */ }); }
如果一定要用系统默认的logo属性,也可以把logo资源包一层layer-list,手动配置inset值抵消系统默认加的内边距,但这个方法需要适配不同系统版本、不同屏幕密度,很容易出现布局错位问题,远不如直接嵌入自定义ImageView稳定。
调整提示:如果需要图标完全撑满视图不留白,把ImageView的
scaleType改成fitXY即可;需要等比缩放不拉伸就保留fitCenter;位置不对直接调整layout_gravity属性,灵活度远高于修改系统默认属性。
内容的提问来源于stack exchange,提问作者JazBass
相关产品推荐
相关产品推荐

