Toolbar 是在 Android5.0 推出的一款 MD 风格的导航控件,主要是为了替换 Actionbar 的。与 Actionbar 相比,Toolbar 非常灵活,我们可以自由地在 Toolbar 内添加子控件。

使用 Toolbar

由于 Toolbar 是在 Android5.0 才开始加上的,低版本要使用的话,需要引入 support-v7 兼容包,使用 android.support.v7.widget.Toolbar 进行开发。

compile 'com.android.support:appcompat-v7:25.3.1'

修改 style

打开 res/values/styles.xml,默认配置如下:

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">        -- Customize your theme here. -->        <item name="colorPrimary">@color/colorPrimary        "colorPrimaryDark">@color/colorPrimaryDark        "colorAccent">@color/colorAccent    style>

来看一下 style 属性所对应的涵义

隐藏默认的 Toolbar

  • 方式1
    改成其他没有 Toolbar 的主题
parent="Theme.AppCompat.Light.NoActionBar"
  • 方式2
    自己建立一个主题,并在属性中设置无 Toolbar
    

如果不隐藏默认 Toolbar,在代码中对 Toolbar 进行 setSupportActionBar 操作时,会报错:

Caused by: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.

在布局文件中添加 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:id="@+id/activity_main"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.ginkwang.toolbarsample.MainActivity">    <android.support.v7.widget.Toolbar        android:id="@+id/tb_main"        android:layout_width="match_parent"        android:layout_height="?attr/actionBarSize"        android:background="?attr/colorPrimary"/>RelativeLayout>

?attr/actionBarSize : 表示根据屏幕的分辨率采用系统默认的高度 如果低版本也要使用的话,则需要使用v7包的,否则只有api21上才能有效

Java 文件中调用

Toolbar 的一些属常用属性也在代码中使用并写明作用了。

public class MainActivity extends AppCompatActivity {    private Toolbar mTbMain;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();    }    private void initView() {        mTbMain = (Toolbar) findViewById(R.id.tb_main);        //设置 APP logo        mTbMain.setLogo(R.mipmap.ic_logo);        //设置主标题,默认为 app_label        mTbMain.setTitle("标题");        //设置主标题文字颜色        mTbMain.setTitleTextColor(getResources().getColor(R.color.colorWhiteOne));        //设置副标题        mTbMain.setSubtitle("副标题");        //设置副标题颜色        mTbMain.setSubtitleTextColor(getResources().getColor(R.color.colorWhiteTwo));        //设置侧边栏(抽屉)的按钮        mTbMain.setNavigationIcon(R.mipmap.ic_navigation);        //取代原本的 Actionbar        setSupportActionBar(mTbMain);    }}

Toolbar 的高级用法

设置 NavigationIcon 的点击事件,需要放在 setSupportActionBar 之后设置才会生效,因为setSupportActionBar 里面也会 setNavigationOnClickListener()

setSupportActionBar(mTbMain);//设置NavigationIcon的点击事件,需要放在setSupportActionBar之后设置才会生效,//因为setSupportActionBar里面也会setNavigationOnClickListenermTbMain.setNavigationOnClickListener(new View.OnClickListener() {      @Override      public void onClick(View pView) {          // TODO: 2017/5/5 添加抽屉      }});

添加菜单 Menu

  • 菜单布局
<?xml version="1.0" encoding="utf-8"?><menu xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto">    <item        android:id="@+id/menu_item_share"        android:icon="@mipmap/ic_share"        android:orderInCategory="1"        android:title="@string/menu_share"        app:showAsAction="always"/>    <item        android:id="@+id/menu_item_about"        android:icon="@mipmap/ic_about"        android:orderInCategory="2"        android:title="@string/menu_about"        app:showAsAction="ifRoom"/>    <item        android:id="@+id/menu_item_more"        android:icon="@mipmap/ic_more"        android:orderInCategory="3"        android:title="@string/menu_more"        app:showAsAction="never"/>menu>

其中,

android:orderInCategory 属性代表 actionbar 里每个item的优先级,值越大优先级越低

app:showAsAction 属性表示是否在 ToolBar 上显示按钮,属性值有如下几种:

  1. always:使菜单项一直显示在ToolBar上
  2. ifRoom:如果有足够的空间,这个值会使菜单项显示在ToolBar上
  3. never:使菜单项永远都不出现在ToolBar上,在…的子项中显示
  4. withText:使菜单项和它的图标,菜单文本一起显示

由于showAsAction属性是在支持包中定义的,所以需要添加命名空间:

xmlns:app="http://schemas.android.com/apk/res-auto"
  • Java 代码中添加 Menu 监听
方法一

重写onCreateOptionsMenu(Menu menu)、onOptionsItemSelected(MenuItem item)

@Override    public boolean onCreateOptionsMenu(Menu menu) {        getMenuInflater().inflate(R.menu.menu_main, menu);        return true;    }    @Override    public boolean onOptionsItemSelected(MenuItem item) {        switch (item.getItemId()) {            case R.id.menu_item_share:                Toast.makeText(MainActivity.this, "分享", Toast.LENGTH_LONG).show();                break;            case R.id.menu_item_about:                Toast.makeText(MainActivity.this, "关于", Toast.LENGTH_LONG).show();                break;            case R.id.menu_item_more:                Toast.makeText(MainActivity.this, "更多", Toast.LENGTH_LONG).show();                break;        }        return true;    }
方法二

重写onCreateOptionsMenu(Menu menu),通过toolbar.setOnMenuItemClickListener()监听

mTbMain.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {            @Override            public boolean onMenuItemClick(MenuItem item) {                switch (item.getItemId()) {                    case R.id.menu_item_share:                        Toast.makeText(MainActivity.this, "分享", Toast.LENGTH_LONG).show();                        break;                    case R.id.menu_item_about:                        Toast.makeText(MainActivity.this, "关于", Toast.LENGTH_LONG).show();                        break;                    case R.id.menu_item_more:                        Toast.makeText(MainActivity.this, "更多", Toast.LENGTH_LONG).show();                        break;                }                return true;            }        });

跟 NavigationIcon 监听事件一样,都是要设置在 setSupportActionBar 之后才会生效。
效果图:

参考

Android开发:最详细的 Toolbar 开发实践总结
ToolBar的使用

更多相关文章

  1. Android学习笔记:布局
  2. android中隐藏ListView滚动条
  3. Android中Activity常用功能设置小结(包括全屏、横竖屏等)
  4. Android(安卓)ListView中动态显示和隐藏Header&Footer的方法(转)
  5. Android(安卓)Notes 之 权限管理
  6. 解读Android之HttpURLConnection
  7. Android(安卓)Google Map设置自动zoom scale
  8. android 启动白屏问题完美解决
  9. ToolBar随ScrollView的滚动改变透明度

随机推荐

  1. Android framework源码之JNI实现过程分析
  2. Android BroadcastReceiver(一)
  3. 百度地图 android 定位Demo
  4. Android示例应用:开源框架Glide的使用
  5. android studio 生成 aar release 包 步
  6. Android(安卓)jni build 多个shared libr
  7. 自定义ViewGroup获取子View参数
  8. Cocos2d-x 3.7 Android&iOS开发环境搭建
  9. Android(安卓)Asset目录下的Apk文件的复
  10. android之xml定义数组