在使用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"
发现就这一句箭头变白色