Android ToolBar箭头的使用

在使用toolbar的activity里,必须让actionbar消失。
1.使用NoActionBar的主题
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> </style>

布局

<android.support.v7.widget.Toolbar
        android:background="@color/colorPrimaryDark"
        app:titleTextColor="@android:color/white"
        android:id="@+id/tool_bar"
        android:layout_width="match_parent"
        android:layout_height="?android:attr/actionBarSize">
        <TextView
            android:id="@+id/tv_title"
            android:layout_gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

</android.support.v7.widget.Toolbar>

2.把toolbar设置为actionbar,并让向上导航可用,大概就这意思。

Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar);
        TextView tvTitle = (TextView) findViewById(R.id.tv_title);
        
        toolbar.setTitle("徐影魔");
        tvTitle.setText("标题");

        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });

箭头应该出来了,就是这样
这里写图片描述
默认好像就是黑色的很丑,可以改成白色的箭头,百度了一下,布局加上两行
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
总体布局就是

<android.support.v7.widget.Toolbar
        app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
        android:background="@color/colorPrimaryDark"
        app:titleTextColor="@android:color/white"
        android:id="@+id/tool_bar"
        android:layout_width="match_parent"
        android:layout_height="?android:attr/actionBarSize">
        <TextView
            android:id="@+id/tv_title"
            android:layout_gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
</android.support.v7.widget.Toolbar>

效果好点:

这里写图片描述

我还想变成其他颜色,可惜百度没有,只能自己找了,我是一般找,一边写的,获取找不到呢,反正无聊。
首先分析,在没有getSupportActionBar().setDisplayHomeAsUpEnabled(true);这句之前是没有箭头的,
说明箭头是actionbar控制的。
我的activity继承了AppCompatActivity,getSupportActionBar()源码如下

 @Nullable
    public ActionBar getSupportActionBar() {
        return getDelegate().getSupportActionBar();
    }

再看getDelegate()

@NonNull
    public AppCompatDelegate getDelegate() {
        if (mDelegate == null) {
            mDelegate = AppCompatDelegate.create(this, this);
        }
        return mDelegate;
    }

又推到AppCompatDelegate身上去了,delegate是代表的意思,原来要找代表,面向对象,办事也要找关系。

再看AppCompatDelegate.create(this, this)

private static AppCompatDelegate create(Context context, Window window,
            AppCompatCallback callback) {
        final int sdk = Build.VERSION.SDK_INT;
        if (BuildCompat.isAtLeastN()) {
            return new AppCompatDelegateImplN(context, window, callback);
        } else if (sdk >= 23) {
            return new AppCompatDelegateImplV23(context, window, callback);
        } else if (sdk >= 14) {
            return new AppCompatDelegateImplV14(context, window, callback);
        } else if (sdk >= 11) {
            return new AppCompatDelegateImplV11(context, window, callback);
        } else {
            return new AppCompatDelegateImplV9(context, window, callback);
        }
    }

我看了下代表传了好几代,AppCompatDelegateImplV9->AppCompatDelegateImplV11->
AppCompatDelegateImplV14->AppCompatDelegateImplV23->AppCompatDelegateImplN
他们的祖宗是AppCompatDelegateImplBase
并且在这个类里我找到了了getSupportActionBar()方法,而AppCompatDelegateImplV9将getSupportActionBar()发扬光大。

@Override
    public void initWindowDecorActionBar() {
        ensureSubDecor();

        if (!mHasActionBar || mActionBar != null) {
            return;
        }

        if (mOriginalWindowCallback instanceof Activity) {
            mActionBar = new WindowDecorActionBar((Activity) mOriginalWindowCallback,
                    mOverlayActionBar);
        } else if (mOriginalWindowCallback instanceof Dialog) {
            mActionBar = new WindowDecorActionBar((Dialog) mOriginalWindowCallback);
        }
        if (mActionBar != null) {
            mActionBar.setDefaultDisplayHomeAsUpEnabled(mEnableDefaultActionBarUp);
        }
    }

终于找到了WindowDecorActionBar,也就是actionbar的实体类。

WindowDecorActionBar里有个DecorToolbar,而DecorToolbar是个接口,没找到他的实现类。

代码找不到了,看看style吧,找了几个小时了。

app:theme="@style/Base.V7.Theme.AppCompat"

发现就这一句箭头变白色

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值