ToolBar讲解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Monkey_LZL/article/details/54024077
关于ToolBar的解析:
自定义ToolBar,首先 ToolBar是Android 5.0推出的一个新的控件用于取代之前的ActionBar,具有很强的可塑造型,用户可以根据自己的喜好自定义ToolBar,一些低版本需要引用android-support-v7包才可以自定义ToolBar,本文将引用v7包,进行ToolBar的讲解:
第一步:修改Styles.xml
<resources>
    <!--设置自定义的ToolBar,其中Light是颜色偏明亮一点的主题,也可以去掉,那主题的颜色等都需要自己设定
            这里的AppTheme要与AndroidManifest.xml中的保持一致,否则需要重新注册--> 
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
         <!--若不为NoActionBar一定要加上这两句,这里可以不加--> 
        <item name="windowActionBar">false</item>
        <item name="android:windowNoTitle">true</item>
        <!--设置自己的ToolBar颜色-->        
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
        <!--设置ToolBar中字体的颜色,为白色--> 
        <item name="android:textColor">#ffffff</item>
        <!--设置ToolBar中Menu中三个点的颜色--> 
        <item name="android:textColorSecondary">#ffffff</item>
        <!--设置ToolBar中Menu的弹出的主题--> 
         <item name="actionOverflowMenuStyle">@style/OverflowMenuStyle</item>
    </style>
    <!--设置ToolBar中Menu的弹出的主题--> 
    <style name="OverflowMenuStyle" parent="@style/Widget.AppCompat.Light.PopupMenu.Overflow">
    <!-- 默认为true,会与Toolbar有覆盖 -->
    <item name="overlapAnchor">false</item>
    <!-- 背景颜色设置 -->
    <item name="android:popupBackground">@color/colorPrimary</item>
    <!-- 弹出的Menu竖直上与Toolbar的距离,保证不会覆盖Toolbar -->
    <item name="android:dropDownVerticalOffset">3dp</item>
    <!-- 弹出的Menu水平上与屏幕间的距离 -->
    <item name="android:dropDownHorizontalOffset">0dp</item>
</style>  
</resources>
注意当引用的v7的包后,使用Toolbar,MainActivity一定要继承AppCompatActivity,而不再是Activity。
注意Stylesxml的布局,与引用。

第二步:修改activity_main.xml:
<!-- 这里定义为auto,在ToolBar中就可以自定义的添加toolbar:title之类的属性,就像在Activity中效果一样 -->
<RelativeLayout xmlns:android=" http://schemas.android.com/apk/res/android"
    xmlns:tools=" http://schemas.android.com/tools"
    xmlns:toolbar=" http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#cccccc"
    tools:context="com.example.mytoolbar.MainActivity" >
<!-- Toolbar本身是一个ViewGroup,所以在里面添加相应的TextView或其他,
颜色数值写成attr属性,这样做是为了屏蔽开发者对应具体数值,比如我们需要设置不同主题下的主色,副色,
或者是不同版本的ActionBar大小,亦或者是不同Dpi下的DrawerLayout的宽度等
app:popupTheme引用了在Styles中设定的主题 -->
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/OverflowMenuStyle"
        toolbar:title="Title"
        toolbar:titleTextColor="#ffffff" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="MyToolBar"
            android:textColor="#ffffff" />
    </android.support.v7.widget.Toolbar>
<!-- 这个ImageView是Activity中PopupMenu中用的,设置侦听,弹出相应的菜单,对应Activity中被注释掉的代码
但这种方法无法方便的与ToolBar中Menu菜单联系,较容易的修改相应的背景属性,而舍弃 -->
    <!--
         <ImageView
        android:id="@+id/more"
        android:layout_width="wrap_content"
        android:layout_height="?attr/actionBarSize"
        android:layout_alignParentRight="true"
        android:onClick="popupmenu"
        android:scaleType="center"
        android:src="@drawable/common_forward_normal" />
    -->

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/toolbar"
        android:text="@string/hello_world"
        android:textColor="#000000" />

</RelativeLayout>
可以考虑将ToolBar设置为一个单独的XMl文件,在Main中进行引用

第三步:修改MainActivity.java:
package com.example.mytoolbar;

import android.app.Activity;
import android.widget.PopupMenu;
import android.widget.PopupMenu.OnMenuItemClickListener;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private Toolbar toolbar;
    private ImageView more;
    private PopupMenu popupMenu;
    private Menu menu;     

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        toolbar = (Toolbar) findViewById(R.id.toolbar);        

        //使用PopupWindow来实现Menu,但是自定义的toolbar在主题中无法更改Menu主题
//        popupMenu = new PopupMenu(this, findViewById(R.id.more));
//        menu = popupMenu.getMenu();
        //通过代码添加菜单项
//        menu.add(Menu.NONE, Menu.FIRST + 0, 0, "复制");
//        menu.add(Menu.NONE, Menu.FIRST + 1, 1, "粘贴");
//        //通过XML文件添加菜单项
//        MenuInflater menuInflater = getMenuInflater();
//        menuInflater.inflate(R.menu.popupmenu, menu);    

//        popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
//           public boolean onMenuItemClick(MenuItem item) {
//                switch (item.getItemId()) {
//                 case R.id.save:
//                 Toast.makeText(MainActivity.this, "保存",
//                 Toast.LENGTH_LONG).show();
//                 break;
//                case Menu.FIRST + 0:
//                    Toast.makeText(MainActivity.this, "复制", Toast.LENGTH_LONG)
//                            .show();
//                    break;
//                case Menu.FIRST + 1:
//                    Toast.makeText(MainActivity.this, "粘贴", Toast.LENGTH_LONG)
//                            .show();
//                    break;
//                default:
//                    break;
//                }
//                return false;
//            }
//        });


        setSupportActionBar(toolbar);
        //title在XML文件中设置为toolbar:title="Title",前提是
        //在RelativeLayout中添加xmlns:toolbar=" http://schemas.android.com/apk/res-auto"
        //用的不是android:命名空间,而是自定义命名空间
//        若采用toolbar.setTitle("Title"),并不能进行修改,默认为项目的名称
//        getSupportActionBar().setTitle("Title");
        getSupportActionBar().setSubtitle("subTitle");
        getSupportActionBar().setLogo(R.drawable.ic_launcher);
        toolbar.setNavigationIcon(R.drawable.ic_launcher2);

    }
//    //在XML中设置了Onclick
//    public void popupmenu(View v) {
//        popupMenu.show();
//    }
//    使用toolbar来实现Menu,自定义的toolbar在主题中可以更改Menu主题,这里进行了重写,自定义了Menu
    @Override
    public boolean onCreateOptionsMenu(Menu menu) { 
           getMenuInflater().inflate(R.menu.main, menu);  
            menu=toolbar.getMenu();
            //通过代码添加菜单项
            menu.add(Menu.NONE, Menu.FIRST + 0, 0, "复制");
            menu.add(Menu.NONE, Menu.FIRST + 1, 1, "粘贴");
            //通过XML文件添加菜单项
            MenuInflater menuInflater = getMenuInflater();
            menuInflater.inflate(R.menu.popupmenu, menu);
            toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        switch (item.getItemId()) {
                            case Menu.FIRST + 0:
                                Toast.makeText(MainActivity.this, "复制", Toast.LENGTH_SHORT).show();
                                break;
                            case Menu.FIRST + 1:
                                Toast.makeText(MainActivity.this, "粘贴", Toast.LENGTH_SHORT).show();
                                break;
                            case R.id.save:
                                Toast.makeText(MainActivity.this, "保存", Toast.LENGTH_SHORT).show();
                                break;
                            case R.id.delete:
                                Toast.makeText(MainActivity.this, "删除", Toast.LENGTH_SHORT).show();
                                break;
                        }
                        return true;//return false 的区别
                    }
                });
           return true;           
    }
}
其中通过不同方式进行了Menu弹出内容的修改,其中R.menu.main为Menu中的main.xml
    xmlns:tools=" http://schemas.android.com/tools"
    tools:context="com.example.mytoolbar.MainActivity" >

    <item
        android:id="@+id/delete"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:title="删除"/>

</menu>
其中通过通过XML文件R.menu.popupmenu添加菜单项,本质上与R.menu.main是一致的,但可以从层次上进行考虑,R.menu.main属于更高一个层次,用于放于ToolBar中的侦听控件,而R.menu.popupmenu属于弹出的额菜单的内容设置。
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android=" http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/save"
        android:title="保存"/>
</menu>

最终的效果图:

主要参考:http://blog.csdn.net/zhyh1986/article/details/51810803#comments
                    http://blog.csdn.net/hanj456/article/details/53579608
                    http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1118/2006.html

猜你喜欢

转载自blog.csdn.net/Monkey_LZL/article/details/54024077
今日推荐