Android 5.X 新特性详解——Toolbar

Posted 黄飞_hf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 5.X 新特性详解——Toolbar相关的知识,希望对你有一定的参考价值。

Toolbar与ActionBar最大的区别就是Toolbar更加自由、可控。这也是Google在逐渐使用Toolbar替换ActionBar的原因,要使用Toolbar必须引入appcompat-v7支持,并设置主题为NoActionBar,因此在styles.xml文件中,使用如下所示代码进行设置。

<resources>

    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- toolbar颜色 -->
        <item name="android:colorPrimary">#4876FF</item>
        <!-- 状态栏颜色 -->
        <item name="android:colorPrimaryDark">#3A5FCD</item>
        <!-- 窗口的背景颜色 -->
        <item name="android:windowBackground">@android:color/white</item>
        <!-- SearchView -->
        <item name="android:searchViewStyle">@style/MySearchView</item>
    </style>

    <!--在Toolbar中可以像使用ActionBar那样增加一些小的View,例如用于搜索的SearchView-->
    <style name="MySearchView" parent="Widget.AppCompat.SearchView" />
</resources>

菜单配置与ActionBar基本类似,代码如下所示:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">

    <item
        android:id="@+id/ab_search"
        android:orderInCategory="80"
        android:title="action_search"
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="ifRoom" />

    <item
        android:id="@+id/action_share"
        android:orderInCategory="90"
        android:title="action_share"
        app:actionProviderClass="android.support.v7.widget.ShareActionProvider"
        app:showAsAction="ifRoom" />

    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:title="@string/action_settings"
        app:showAsAction="never" />
</menu>

使用Toolbar的核心代码如下所示:

public class MainActivity extends AppCompatActivity 

    private Toolbar mToolbar;
    private DrawerLayout mDrawerLayout;
    private ActionBarDrawerToggle mDrawerToggle;
    private ShareActionProvider mShareActionProvider;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mToolbar = (Toolbar) findViewById(R.id.toolbar);
        mToolbar.setLogo(R.mipmap.ic_launcher);
        // 标题的文字需在setSupportActionBar之前,不然会无效
        mToolbar.setTitle("主标题");
        mToolbar.setSubtitle("副标题");
        //通过setSupportActionBar方法就可以用Toolbar模拟出ActionBar的效果
        setSupportActionBar(mToolbar);

        /**
         * 将Toolbar与DrawerLayout结合起来,实现android 5.X 中DrawerToggle状态变化的动态效果,即最左边的
         * Toggle在DrawerLayout滑动时,会从三条横线间变成一个箭头状的图案。
         */
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer);
        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, mToolbar,
                R.string.abc_action_bar_home_description,
                R.string.abc_action_bar_home_description_format);
        mDrawerToggle.syncState();
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        // 菜单的监听可以在toolbar里设置,
        // 也可通过Activity的onOptionsItemSelected回调方法来处理
        mToolbar.setOnMenuItemClickListener(
                new Toolbar.OnMenuItemClickListener() 
                    @Override
                    public boolean onMenuItemClick(MenuItem item) 
                        switch (item.getItemId()) 
                            case R.id.action_settings:
                                Toast.makeText(MainActivity.this, "action_settings", Toast.LENGTH_SHORT).show();
                                break;
                            default:
                                break;
                        
                        return true;
                    
                );
    

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
        getMenuInflater().inflate(R.menu.menu_main, menu);
        //ShareActionProvider配置
        mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(menu.findItem(R.id.action_share));
        Intent intent = new Intent(Intent.ACTION_SEND);
        intent.setType("text/*");
        mShareActionProvider.setShareIntent(intent);
        return super.onCreateOptionsMenu(menu);
    

布局文件如下所示:

<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <include layout="@layout/toolbar" />

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <!-- 内容界面 -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/holo_blue_light"
            android:orientation="vertical" >
            <Button
                android:layout_width="100dp"
                android:layout_height="match_parent"
                android:text="内容界面"/>
        </LinearLayout>

        <!-- 侧滑菜单内容 必须指定其水平重力 -->
        <LinearLayout
            android:id="@+id/drawer_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:orientation="vertical" >
            <Button
                android:layout_width="200dp"
                android:layout_height="match_parent"
                android:text="菜单界面"/>
        </LinearLayout>

    </android.support.v4.widget.DrawerLayout>


</LinearLayout>
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    android:minHeight="?attr/actionBarSize"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    app:theme="@style/ThemeOverlay.AppCompat.ActionBar" />

程序运行效果如下所示:

代码地址

以上是关于Android 5.X 新特性详解——Toolbar的主要内容,如果未能解决你的问题,请参考以下文章

Android 5.X 新特性详解——Notification

Android 5.X 新特性详解——Notification

Android 5.X 新特性详解——列表与卡片

Android 5.X 新特性详解——Toolbar

Android 5.X 新特性详解——Activity过渡动画

Android 5.X新特性