Toolbar是什么?官方介绍:Toolbar是应用的内容的标准工具栏,是由以前的Actionbar的升级后得到的,需要注意的是他们不是说两个独立的控件,而是相互关联的,要使用Toolbar还是得跟ActionBar扯上关系的。源代码是这样注释的:
A Toolbar is a generalization of {@linkActionBar action bars} for use
within application layouts.
相比Actionbar Toolbar最明显的一点就是变得很自由,可随处放置,设计更自由。它是作为一个ViewGroup来定义使用的,所以单纯使用ActionBar已经稍显过时了,它的一些方法已被标注过时。
那么它怎么使用呢,首先我们一样要用到v7的支持包,然后定义程序的主题样式,在style里得先把Actionbar去掉,有点像欲想练功,必先自宫的感觉啊。那么最简单的使用方式就是下面的情况
1、设计style
<stylename="AppTheme"parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<itemname="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
当然这是在系统自动生成的style上修改的,也是最直接的使用方式,修改的地方就是parent的内容:需要使用NoActionBar的主题
2、在布局文件中添加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"
>
<!--使用toolBar时,需要的主题是NoActionBar-->
<android.support.v7.widget.Toolbar
android:id="@+id/toolBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#3F51B5"
android:popupTheme="@style/AppTheme">
</android.support.v7.widget.Toolbar>
</RelativeLayout>
3、设计右上角的导航按钮
创建menu文件夹,在eclipse中menu文件夹是本来就存在的,但是在android studio中后来就没有主动显示出来了,所以我们需要自己创建,这个很简单
点击res --->右键--->new--->directory,然后自己命名为menu ,然后点击menu ---右键---new Menu resource file
或者直接new Android resource directory,在下拉选项中选择类型menu,并且命名文件名
<?xml version="1.0"encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto">
<!--actionbar里每个item的优先级,值越大优先级越低,actionbar地方不够就会放到overflow中-->
<itemandroid:id="@+id/ab_search"
android:orderInCategory="80"
android:title="search"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="ifRoom"
>
</item>
<item
android:id="@+id/ab_share"
android:orderInCategory="90"
android:title="share"
app:actionProviderClass="android.support.v7.widget.ShareActionProvider"
app:showAsAction="ifRoom">
</item>
<item
android:id="@+id/setting"
android:orderInCategory="100"
android:title="action_settings"
android:icon="@mipmap/ic_menu"
app:showAsAction="always"></item>
</menu>
在这里有几个值得注意的地方
1、app命名空间:也就是:xmlns:app="http://schemas.android.com/apk/res-auto"
这个东西相信大家也不陌生,就是我们自定义控件的时候自己定义的空间,现在呢可以直接使用这个,添加它的方式也很简单,有人 说复制一下嘛,嘿嘿,万一手头没有呢,只要打app然后会提示appNS,就是它了,按快捷键就行,不要问我快捷键是啥,什么?你不知道?好吧 ctrl+空格
2、android:orderInCategory属性
你问别人的时候,有人会这样告诉你:啊,就是优先级。再多一句就是:数值越大,优先级越低。好吧,刚开始我也是不明白,试了之后才明白,就是在导航栏里排列的顺序
就是右上角的三个栏从左往右的排列顺序,值越大,越靠后
3、图标问题:、
有人在写的时候会纠结,我没有搜索按钮和分享按钮的图标啊,那么你就out啦,我的图片文件夹里也没有啊,那么他们来自哪里呢?这里:
app:actionViewClass="android.support.v7.widget.SearchView"
app:actionProviderClass="android.support.v7.widget.ShareActionProvider"
当然啦,还有好几个,我们以后遇到了再讲,大家发现新的也要告诉我啊
4、app:showAsAction
当写下这行代码的时候,一定要添加app的命名空间,也就是在1里我们讲的
4、java代码实现
准备了这么久,如果再不让大家看到点效果,估计有些人的心就开始躁动了,那么,好吧,临门一脚了,我们在java代码里添加一些代码就可以看到最初的效果了
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
public class MainActivityextends AppCompatActivity{
privateToolbar toolbar;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar= (Toolbar) findViewById(R.id.toolBar);
// toolbar.setLogo(R.mipmap.ic_launcher);//设置app logo
// toolbar.setSubtitle("Subtitle");//设置子标题
toolbar.setNavigationIcon(R.mipmap.home);//设置导航栏图标
toolbar.setTitle("LuoFeng"); //设置主标题
toolbar.inflateMenu(R.menu.main_menu); //设置右上角的填充菜单
//setSupportActionBar(toolbar);
}
}
好了,可以运行了,运行效果是这样的。
当然啊,那个圆点不是哈,那是其他的效果,回头再给大家讲。
在这里呢,大家发现我注释掉了一些东西,比如子标题
在最后一行我也注释掉了一行://setSupportActionBar(toolbar);
1、这一行代码如果在这里写上呢,首先要保证你的Activity继承AppCompatActivity,如果不写的话,就可以继承Activity等。
2、这行代码如果写上的话呢,会出现右边图所示的现象,就是设置的东西会消失
那么怎么解决这个问题呢?我们有很多种方法:
1、在toolbar中自己添加控件,作为菜单来显示。不要问我为什么?在开始的时候就说明了嘛,ToolBar继承GroupView
2、将menu的资源文件放在onCreateOptionsMenu()方法里加载,不用toolbar加载
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu,menu);
return true;
}
下面运行就没有问题了
那么,喜欢思考问题的人就又有问题要问了,那就是左上角的logo我们通常会需要点击划出侧边栏,那么监听怎么办呢?
这里也有两种方式可以给这个logo添加监听
1、使用toolBar自带的监听
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this,"sssssssssssssssss",Toast.LENGTH_LONG).show();
}
});
2、使用menu的监听方法:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case android.R.id.home:
Toast.makeText(MainActivity.this,"sssssssssssssssss",Toast.LENGTH_LONG).show();
break;
}
return super.onOptionsItemSelected(item);
}
有人会问,那个id是从哪里来的呢?好吧,我告诉你:
android.R.id.home就是现在系统默认的toolbar里icon的id。
好了,toolBar的简单介绍就到这里,有问题和新的发现的大家都可以告诉我啊