在android中app往往需要一个顶部操作栏,实现的方式也可以有多种,常见的有直接在xml中添加控件当作顶部操作栏。又或者使用ActionBar。然而现在android的建议是使用ToolBar。
ToolBar的使用结合了ActionBar和xml中添加控件的优势,可视化直观性比较好,操作性也比较好。使用ToolBar需要在theme中使用继承自Base.ThemeOverlay.AppCompat的风格,例如:ThemeOverlay.AppCompat.ActionBar,这些风格可以直接使用在ToolBar控件中。这里使用的是
Theme.AppCompat.Light.NoActionBar
的style,这个风格会禁止老旧的ActionBar,这种风格往往作为Activity的风格,使用上不是很好。然后Activity需要继承自AppCompatActivity,同时AppCompatActivity.setSupportActionBar(ToolBar)方法可以将ToolBar当作ActionBar进行操作。
如果使用的是ActionBar,那么Activity需要继承ActionBarActivity,theme的style需要继承Theme.holo或者其子类。
@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; }中,menu_main可以定义菜单项,
@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); }则是菜单项点击事件。
注意,使用ActionBar兼容低版本需要导入support-appcompat-v7兼容包,然后ActionBarActivity中得到ActionBar返回使用的是个体SupportActionBar()方法,同时注意getSupportActionBar().getThemedContext()方法可以给ActionBar填充东西。ActionBar有许多可操作的地方,这里不一一进行解释。
对于ToolBar,设置Theme的style为Theme.AppCompat.Light.NoActionBar,继承AppCompatActivity之后,有两种做法:1.当作ActionBar使用,这个时候需要设置setSupportActionBar(ToolBar),然后系统会自动使用ActionBar的方法作为ToolBar的方法,例如onCreateOptionsMenu,onOptionsItemSelected等。2.当作其他用途,一般就是当成控件使用,这个时候需要手动加载ToolBar,但是不用调用setSupportActionBar(ToolBar)方法。调用过程一般如下:
这个过程就是给ToolBar加载item布局,然后监听item点击事件。
- Toolbar toolbar = (Toolbar)findViewById(R.id.mytoolbar);
- toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener(){
- public boolean onMenuItemClick(MenuItem item){
- return true;
- }
- });
- toolbar.inflateMenu(R.menu.your_toolbar_menu);
对于ToolBar的xml布局,一般使用中,当作一个普通控件使用即可,布局一般如下:
但是如果需要实现一些Merterial Design的风格,则需要跟CoordinatorLayout,CollapsingToolBarLayout,AppBarLayout等配合使用,往往CoordinatorLayout作为根布局,然后CoordinatorLayout,CollapsingToolbarLayout,AppBarLayout基本上就是叠层摆放的。
- <android.support.v7.widget.Toolbar
- android:layout_height="wrap_content"
- android:layout_width="match_parent"
- android:minHeight="?attr/actionBarSize"
- app:theme="@style/ThemeOverlay.AppCompat.ActionBar" />
ToolBar的xml布局中,一般设置app:theme和app:popupTheme风格,一般设置app:popupTheme="ThemeOverlay.AppCompat.Light",这个属性是设置弹出窗口风格的。另外,对于ToolBar的高度,可以使用系统自身建议的高度使用属性"?attr/actionBarSize"。
注意,这个无论是ActionBar,还是ToolBar这些顶部操作栏,在MD(Meterial Design)之中,同意叫app bar了。
最后讲讲一些细节。在ToolBar中,setNavigationIcon设置最左的图标,同时这个设置需要在setSupportActionBar之后才有作用,否则会出现back button。setLogo设置最左的第二个图标,也就是Activity的logo,一般如果没使用setNavigationIcon的话,setLogo的图标会在最左。setTitle设置标题,setSubtitle副标题,副标题在标题之下。setOnMenuItemClickListener设置菜单项点击监听。最后注意,menu的item摆放是横向摆放在ToolBar的右边的,这点需要注意。同时menu的item项往往只设置最右边的那个,也就是R.id.action_settings的item项,这个项点击可以弹出下拉框。
最后style的item项可以设置ToolBar的相关属性,常见属性有
colorPrimaryDark属性设置的是最顶端的status bar状态栏,也就是设置设置wifi,时间,电池的地方的背景颜色。
colorPrimary属性设置的是ToolBar的背景颜色。
textColorPrimary设置的是ToolBar标题颜色。
navigationBarColor属性设置的是底部导航栏的背景颜色,但是手机往往是没有导航栏的,所以这个属性不常用。
android:windowBackground设置的是主界面的颜色,当style作为theme使用时这个设置比较很有用。
android:windowNoTitle可以设置是否需要标题栏。
windowActionBar设置是否需要ActionBar。
另外,如果android版本不低于5.0的话,可以继承anrdoid:Theme.Meterial风格,使用android:statusBarColor代替colorPrimaryDark。默认情况下,android:statusBarColor继承自android:colorPrimaryDark。注意区分colorPrimaryDark与android:colorPrimaryDark!
ps:在将ToolBar作为布局控件使用时,需要注意,返回按钮是一定要使用的,否则最左边将会有部分的空间不能使用到,这点是需要特别注意的!
ps:需要在AndroidManifest中添加android:parentActivityName才能使navigationIcon的按钮点击返回上一个Activity!
未完成