Android平板Toolbar溢出图标多余内边距问题:手机端标题居中平板异常如何解决
解决平板上Toolbar溢出图标多余内边距的问题
这个问题我之前也碰到过!本质上是你在Toolbar里放的那个宽为match_parent的自定义TextView,挤压了Toolbar默认用来放action按钮(就是那个溢出图标)的区域,再加上平板设备上Toolbar的默认内边距设置和手机不同,就出现了多余的间距。给你几个实用的解决办法:
方法一:用Toolbar自带的标题居中属性(推荐)
完全不用自定义TextView,直接利用Toolbar本身的属性来实现标题居中,这样既简洁又不会和action按钮区域冲突:
修改Toolbar的布局代码如下:
<android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="@android:color/white" android:fitsSystemWindows="true" app:popupTheme="@style/AppTheme.PopupOverlay" app:titleCentered="true" <!-- 开启标题居中 --> app:titleTextColor="@color/color_toolbar" <!-- 设置标题颜色 --> app:titleTextAppearance="@style/ToolbarTitleStyle" /> <!-- 绑定标题样式 -->
接着在res/values/styles.xml里定义标题的样式,对应你原来TextView的属性:
<style name="ToolbarTitleStyle" parent="@style/TextAppearance.Widget.AppCompat.Toolbar.Title"> <item name="android:textSize">@dimen/titleToolbar</item> <item name="android:maxLines">1</item> </style>
这样设置后,平板上的溢出图标就会回到正常位置,不会有多余内边距了。
方法二:调整自定义TextView的宽度与Toolbar内边距
如果你一定要保留自定义TextView,那别让它占满整个Toolbar宽度,改成wrap_content,再配合调整Toolbar的内边距:
修改布局代码:
<android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="@android:color/white" android:fitsSystemWindows="true" android:gravity="center" <!-- 让内部控件居中 --> app:popupTheme="@style/AppTheme.PopupOverlay" app:contentInsetStart="0dp" <!-- 消除左侧默认内边距 --> app:contentInsetEnd="0dp"> <!-- 消除右侧默认内边距 --> <TextView android:id="@+id/centerTitleToolbarTextView" android:layout_width="wrap_content" <!-- 改为wrap_content --> android:layout_height="match_parent" android:gravity="center" android:maxLines="1" android:textColor="@color/color_toolbar" android:textSize="@dimen/titleToolbar" /> </android.support.v7.widget.Toolbar>
这个方法通过限制TextView的宽度,避免它挤压action按钮的空间,同时消除Toolbar默认的内边距,解决多余间距问题。
方法三:代码动态适配平板
如果上面的xml设置没起效果,还可以通过代码判断设备类型,只在平板上调整Toolbar的内边距:
首先在Activity的onCreate方法里添加:
Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); // 判断当前是否为平板设备 boolean isTablet = getResources().getBoolean(R.bool.is_tablet); if (isTablet) { // 消除Toolbar的内容内边距 toolbar.setContentInsetsAbsolute(0, 0); }
然后创建两个bool资源文件:
- 在
res/values/bools.xml里:
<bool name="is_tablet">false</bool>
- 在
res/values-sw600dp/bools.xml里(平板设备会加载这个):
<bool name="is_tablet">true</bool>
这样就只会在平板设备上调整内边距,不会影响手机端的布局。
内容的提问来源于stack exchange,提问作者Arman Manucharyan
相关产品推荐
相关产品推荐

