Toolbar消除默认左边距

最近在项目中用Toolbar封装标题栏,替换之前的Linearlayout,遇到了设置Navigationicon的时候左边多出了空白区域,通过查阅资料以及查看Toolbar的源码,找到了三种可以消除左边距的办法。

1. 将需要设置的图片切成以Toolbar的高度为边长的正方形图片

2. 设置Navigationicon的style

3. 通过反射更改Navigationicon的button大小

切图方式

  • 通过查看Toolbar的源码可以知道,当调用setNavigationIcon的时候会间接调用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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样式

    1
    2
    3
    4
    5
    <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的样式

    1
    2
    3
    4
    5
    <style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="toolbarNavigationButtonStyle">@style/NavigationStyle</item>
    <item name="windowNoTitle">true</item>
    </style>
  • 给Activity设置样式

    1
    2
    3
    4
    5
    6
    7
    8
    <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的大小

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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();
    }