正如大家熟知的,Toolbar是一个Material控件,他的出现基本上可以取代ActionBar。由于ActionBar被限定只能位于活动的顶部,从而不能实现一些Material Design的效果,因此官方现在已经不再建议使用ActionBar。
首先,我们先来了解一下如何简单的使用Toolbar,当我们创建一个项目的时候,默认的会显示Actionbar,关于查看Actionbar就是第一步:先打开AndroidManifest.xml文件,然后在android:theme属性下只动了AppTheme的主题,这个主题就是继承DarkActionBar。这是一个深色的ActionBar主题。
<resources> <!-- Base application theme. --> <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> </style> </resources>
既然找到了创建项目是为我们默认设置的ActionBar,那么我们就需要将他更改为NoActionBar,这样就完成了Toolbar替代ActionBar的第一步。
<resources> <!-- Base application theme. --> <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> </resources>
然后我们就需要在我们需要创建头布局的文件里面添加Toolbar控件。
<android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" ></android.support.v7.widget.Toolbar>
这段代码就很容易理解,就是设置Toolbar的宽和高,高度的话我设置的是和ActionBar一样的高度,颜色用的是标题栏的默认颜色。这样就可以代替ActionBar了。
然后我们需要在MainActivity中添加代码:
Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar);这样我们就完成了Toolbar的基本使用,和实现了ActionBar的基本效果。另外还要注意的是在导入Toolbar的库时要是导入
import android.support.v7.widget.Toolbar;
,否则的话可能报错。
效果如图所示
接下来我就来说说我在开发中遇到的一些问题,以及我自亲测有效的解决方案:
第一个问题:如果想要在文字的左边设置一个图标,该如何实现。
这个问题算是比较简单了,网上有很多解决方案,本来一开始我用了最蠢的方法,也就是在Toolbar的内部添加了一个图标,然后放置在最左边,但在网上我学会了另一种方法,分享一下。
toolbar.setNavigationIcon(R.drawable.menu);
很简单,只要加这一行代码,就可以添加一个左侧图标,然后我们获取他的点击事件就很容易:
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: Toast.makeText(MainActivity.this,"aaaaa",Toast.LENGTH_SHORT).show(); break; } return super.onOptionsItemSelected(item); }
其中R.id.home就是导航图标默认的id。
第二个问题:如果Toolbar设置在Fragment里面,该如何让Toolbar生效?
首先我们要明确的是Toolbar在Activity里面是需要调用setSupportActionBar()方法的,而在fragment里面你会发现居然没有这个方法,那么具体应该怎么实现呢?
((AppCompatActivity)mContext).setSupportActionBar(toolbar); setHasOptionsMenu(true);
注意的是这里我没有写具体详细的代码,这里只是将上下转文换成AppCompatActivity类型。下面这句就是在设置他的menu中需要的。
第三个问题:如何隐藏项目的名字,有时候我们会遇到自定义标题,但是不需要项目名称,那么该怎么隐藏?
一开始我的想法是将配置文件中的Label标签改变为空字符串,这样就不会有项目名,但是发现这样在应用名也会变成空。这时候我们只需要将Toolbar的setTitle()方法设置为空就ok了。
toolbar.setTitle("");
但是要注意的是,这行代码一定要放在setSupportActionBar的前面,要不然不会有效果的。