Toolbar消除默认左边距

作者: wustor | 来源:发表于2017-03-10 15:58 被阅读593次

    最近在项目中用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();
            }
    

    相关文章

      网友评论

        本文标题:Toolbar消除默认左边距

        本文链接:https://www.haomeiwen.com/subject/pwfggttx.html