ToolBar的使用和注意事项

版权声明:博客内容原创,部分图片有可能来源于其他人的截图或者使用。本博客仅供学习 https://blog.csdn.net/gulang_luofeng/article/details/52939324

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的简单介绍就到这里,有问题和新的发现的大家都可以告诉我啊

猜你喜欢

转载自blog.csdn.net/gulang_luofeng/article/details/52939324