最近在项目中用Toolbar封装标题栏,替换之前的Linearlayout,遇到了设置Navigationicon的时候左边多出了空白区域,通过查阅资料以及查看Toolbar的源码,找到了三种可以消除左边距的办法。
1. 将需要设置的图片切成以Toolbar的高度为边长的正方形图片
2. 设置Navigationicon的style
3. 通过反射更改Navigationicon的mNavButtonView大小
切图方式
- 通过查看Toolbar的源码可以知道,当调用setNavigationIcon的时候会间接调用
private ImageButton mNavButtonView;
public void setNavigationIcon(@Nullable Drawable icon) {
if (icon != null) {
ensureNavButtonView();
if (!isChildOrHidden(mNavButtonView)) {
addSystemView(mNavButtonView, true);
}
} else if (mNavButtonView != null && isChildOrHidden(mNavButtonView)) {
removeView(mNavButtonView);
mHiddenViews.remove(mNavButtonView);
}
if (mNavButtonView != null) {
mNavButtonView.setImageDrawable(icon);
}
}
- 最终图标赋值给了Imagebutton
设置Style方式
- 自定义一个Navigationicon样式
<style name="NavigationStyle" parent="@style/Widget.AppCompat.Toolbar.Button.Navigation">
<item name="android:minWidth">0dp</item>
<item name="android:paddingLeft">0dp</item>
<item name="android:scaleType">centerInside</item>
</style>
- 自定义一个Activity的样式引入Navigationicon的样式
<style name="AppTheme.NoActionBar">
<item name="windowActionBar">false</item>
<item name="toolbarNavigationButtonStyle">@style/NavigationStyle</item>
<item name="windowNoTitle">true</item>
</style>
- 给Activity设置样式
<activity
android:name=".MainActivity"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
- 边距消除
通过反射修改Navigationicon的大小
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setNavigationIcon(R.mipmap.arrow_black_back);
try {
Field mNavButtonView = Toolbar.class.getDeclaredField("mNavButtonView");
if (mNavButtonView != null){
mNavButtonView.setAccessible(true);
AppCompatImageButton nbv = (AppCompatImageButton) mNavButtonView.get(toolbar);
nbv.setMinimumWidth(0);
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}