- 最近在项目中用Toolbar封装标题栏,替换之前的Linearlayout,遇到了设置Navigationicon的时候左边多出了空白区域,通过查阅资料以及查看Toolbar的源码,找到了三种可以消除左边距的办法。
1. 将需要设置的图片切成以Toolbar的高度为边长的正方形图片
2. 设置Navigationicon的style
3. 通过反射更改Navigationicon的button大小
切图方式
- 通过查看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(); }