总体上来说,Toolbar的使用可以分为两个方面,一方面是将ToolBar当作ActionBar来用,另一方面就是将Toolbar当成一个单独的控件来用,不过到目前为止我见到的大部分情况都是把Toolbar当作ActionBar来用,下面我们分别就这两种使用方式来进行说明。
将Toolbar当作ActionBar使用首先要隐藏系统默认的ActionBar,隐藏方式其实很简单,只需要简单设置一下style就可以了,如下了:
<style name="AppTheme.NoActionBar"> <item name="android:windowActionBar">false</item> <item name="android:windowNoTitle">true</item> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> </style>
<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>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="org.mobiletrain.toolbar2.MainActivity"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="@color/colorPrimary" android:popupTheme="@style/AppTheme.PopupOverlay"> </android.support.v7.widget.Toolbar> </LinearLayout>
<style name="AppTheme.PopupOverlay" parent="Theme.AppCompat.Light">
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); toolbar.setTitle("主标题"); toolbar.setSubtitle("二级标题"); //设置应用Logo toolbar.setLogo(R.drawable.a5k); //设置导航图标 toolbar.setNavigationIcon(R.drawable.ic_menu_back); //用ToolBar代替ActionBar setSupportActionBar(toolbar);
可是这个导航箭头太丑了,其实这里我们用系统默认的箭头就可以了,设置方式如下:
//设置导航图标 // toolbar.setNavigationIcon(R.drawable.ic_menu_back); //用ToolBar代替ActionBar setSupportActionBar(toolbar); //显示导航按钮并使之处于可点击状态 getSupportActionBar().setDisplayHomeAsUpEnabled(true);
这个默认的后退按钮比起ActionBar中的后退按钮漂亮多了吧。如果你用过ActionBar里边的后退按钮你就会知道它有多丑。
OK,接下来,如果我想要在Toolbar上显示菜单项该怎么办呢?以前ActionBar的时候你怎么办现在还怎么办!
先写菜单文件,如下:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/setting" android:icon="@drawable/a5k" android:orderInCategory="99" android:title="setting" app:showAsAction="never"/> <item android:id="@+id/search" android:title="search" app:actionViewClass="android.support.v7.widget.SearchView" app:showAsAction="always"/> <item android:id="@+id/share" app:actionProviderClass="android.support.v7.widget.ShareActionProvider" app:showAsAction="never" android:title="share"></item> </menu>
@Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return super.onCreateOptionsMenu(menu); }
貌似没有什么难度,然后菜单事件的处理依然在onOptionsItemSelected方法中,如下:
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: Log.d("lenve", "onOptionsItemSelected() returned: " + 456); break; } return super.onOptionsItemSelected(item); }
你既可以把Toolbar当作ActionBar来用,也可以当作普通控件来用,虽然这种用法比较少见。当作普通控件来用的话,那我就没有必要隐藏ActionBar了(不给新的Activity在清单文件中设置我们在文章开头创建的AppTheme.NoActionBar主题即可)。那我依然是先在布局文件中来写一个Toolbar,不同的是,这次我把它放在屏幕的正中央,代码如下:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="org.mobiletrain.toolbar2.Main2Activity"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:layout_centerInParent="true" android:background="@color/colorPrimary" android:popupTheme="@style/AppTheme.PopupOverlay"> </android.support.v7.widget.Toolbar> </RelativeLayout>
OK,Toolbar已经显示在屏幕正中央了,但是既然把它当作一个普通控件来使用,我们在怎么向Toolbar中添加菜单项呢?如下,需要Toolbar自己加载:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); toolbar.inflateMenu(R.menu.main); }
OK,接下来一个问题是怎么给这些控件设置点击事件呢,如下:
toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.search: Log.d("lenve", "onMenuItemClick() returned: search"); break; case R.id.setting: Log.d("lenve", "onMenuItemClick() returned: setting"); break; case R.id.share: Log.d("lenve", "onMenuItemClick() returned: share"); break; } return true; } });