Toolbar与Actionbar最大的不同,个人认为是toolbar可以自由定制,关于Toolbar的基本使用这里不做讲述,这里来说下自定义toolbar的使用,首先最常见的是,我们一般把toolbar作为标题栏来使用,而toolbar默认的文字是在左侧显示,而大部分时候我们希望标题的文字是在中间显示,那么如何实现呢,查看源码我们发现,toolbar继承自viewgroup的,那么我们可以在toolbar里面添加一个textview居中显示,把原本的title设置为空,布局如下:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="@dimen/toolbar_padding_top"
android:background="@color/primary_color"
android:minHeight="?attr/actionBarSize"
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" >
<TextView
android:id="@+id/base_tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textSize="20sp"
android:textStyle="bold"
android:text="居中"/>
</android.support.v7.widget.Toolbar>
代码:
private void initToolbar() {
toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle("");
title = (TextView)toolbar.findViewById(R.id.base_tv_title);
}
然后我们可以设置自己想要显示的标题了:
if (toolbar != null) {
setSupportActionBar(toolbar);
title.setText("首页");
}
效果如下:
左边一般我们也有返回的图标,这个可以直接用toolbar的属性实现,代码如下:
toolbar.setNavigationIcon(R.drawable.left_back);
点击事件:
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "Navigation is click", Toast.LENGTH_SHORT).show();
}
});
而对于右边,我们可以用菜单来实现,如果是单纯的一个文字,我们直接在xml文件中定义一个菜单,如下:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">
<item
android:id="@+id/action_settings"
android:orderInCategory="100"
android:title="设置"
app:showAsAction="always" />
</menu>
关于showAsAction属性,always是一直显示出来;never是不显示出来;ifRoom是会显示在Item中,但是如果已经有4个或者4个以上的Item时会隐藏在溢出列表中。当然个数并不仅仅局限于4个,依据屏幕的宽窄而定;如果同时设置了icon和title,默认只会显示icon,如果想同时显示title和icon,可以加入app:showAsAction=”always|withText”,但是即便这样也不会一定生效,withText对actionBar的title来说只是一个hint,在条件允许的情况下actionBar会显示title,但是当设置了icon并由于空间限制也不会显示title。不过,官方还是建议我们设置title的,在长按icon的情况下title就会出现,另外官方还建议showAsAction最好设置为ifRoom,如果设置为always可能会在比较窄的屏幕上带来布局的问题。
然后代码中如下:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
这样机会实现上面的那个右边显示设置的样式,点击事件在onOptionsItemSelected中做处理。
自定义样式大概就如此了。