toolbar的使用姿势
Toolbar作为替代ActionBar的控件,Toolbar没有ActionBar所让人诟病的使用不方便
初步使用
Toolbar的使用非常简单。只要在我的布局文件中把Toolbar控件加入:
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
然后在Activity文件中和处理普通控件一样通过findViewById()
方法找到该控件,并通过Activity的setSupportActionBar(Toolbar)
方法进行设置即可。在这里我为toolbar设置了一个导航图标:(我使用的v7包下的Toolbar,因此Activity需要是FragmentActivity的子类)
mToolbar= (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
mToolbar.setNavigationIcon(R.drawable.nav);
执行!出现了如下的错误:
造成该问题的原因在于我当前的Activity上已经有了一个ActionBar,因此不能再添加一个Toolbar。解决该问题有s三种种方式:
修改style文件中的AppTheme的内容,使得ActionBar不能使用:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. --> <item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorAccent">@color/colorAccent</item> <!--<item name="windowActionBar">false</item>--> <!--<item name="windowNoTitle">true</item>--> </style>
修改manifest文件中的Activity的主题,选择一个不带ActionBar的系统主题
<application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/Theme.AppCompat.Light.NoActionBar"> ... </application>
第三种方法实在上和第二种方式类似,但自定义空间大,同样是修改style文件。在style文件中直接新建一个style,然该style直接继承系统不带ActionBar的style,然后在manifest文件中使用该主题
<style name="AppTheme.NoTitleBar" parent="Theme.AppCompat.DayNight.NoActionBar"></style> <!-------menifest-------> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme.NoTitleBar"> </application>
## 添加功能
根据Android的官方文档中提到的的内容:
按照官方文档上所说的的,Toolbar中可以添加5类功能
- 一个导航图标
- 一个App的logo图标
- 一个标题和副标题
- 一个或多个自定义控件
菜单
上图是把Toolbar中能够添加的控件全部添加后的界面。(搞一下知乎,嘻嘻)
实现上面效果的代码如下:
布局文件:在Toolbar中能够直接添加控件。(Toolbar毕竟是继承ViewGroup的控件)
<android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" > <TextView android:text="你好" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <ImageView android:layout_marginLeft="20dp" android:src="@drawable/clock" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </android.support.v7.widget.Toolbar>
菜单文件:
<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:title="setting" app:showAsAction="never"/> </menu>
android推荐在使用showAsAction属性时使用 app的的属性而不是使用android属性
Activity中的代码
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mToolbar = (Toolbar) findViewById(R.id.toolbar); mToolbar.setNavigationIcon(R.drawable.nav); mToolbar.setLogo(R.drawable.zhihu); mToolbar.setTitle("知乎"); mToolbar.setSubtitle("仿冒一下"); setSupportActionBar(mToolbar); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater menuInflater = getMenuInflater(); menuInflater.inflate(R.menu.menu, menu); return true; }
在这中间有几点需要注意:
setSupportActionBar()方法的调用地方
如果setSupportActionBar() 调用的位置太靠前,会使得Toolbar的部分设置没有效果,例如把setSupportActionBar()方法在setTitle方法前调用,Toolbar的title将显示我们的项目名,而不是我所填写的知乎。最好是在Toolbar的所有设置都已经完成后调用setSupportActionBar()方法。
menu的使用
在Toolbar中有一个inflateMenu()的方法,通过该方法可以设置Toolbar上面的OptionsMenu,但是当调用了setSupportActionBar()方法后该设置将无效,因此还是在Activity的onCreateOptionsMenu()方法中设置OptionsMenu。