• 12.9 Toolbar" level="2">12.9 Toolbar

    12.9 Toolbar" class="reference-link">12.9 Toolbar

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

    1. <?xml version="1.0" encoding="utf-8"?>
    2. <resources>
    3.  
    4. <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    5. <!-- toolbar颜色-->
    6. <item name="colorPrimary">#4876FF</item>
    7. <!--状态栏颜色-->
    8.  
    9. <item name="colorPrimaryDark">#3A5FCD</item>
    10. <!--窗口的背景颜色-->
    11. <item name="android:windowBackground">@android:color/white</item>
    12. <!-- add SearchView -->
    13. <item name="searchViewStyle">@style/MySearchView</item>
    14. </style>
    15.  
    16. <style name="MySearchView" parent="Widget.AppCompat.SearchView" />
    17. </resources>

    在Toolbar中,可以像使用Actionbar那样增加一些小的View,例如用于搜索的SearchView。同时,不要忘了在Gradle配置文件中增加对appcompat-v7的引用,代码如下所示。

    1. dependencies {
    2. compile fileTree(dir: 'libs', include: ['*.jar'])
    3. compile 'com.android.support:appcompat-v7:21.0.3'
    4. }

    在代码中,可以通过如下所示的代码来添加Toolbar显示的标题和图标。

    1. mToolbar = (Toolbar) findViewById(R.id.toolbar);
    2. mToolbar.setLogo(R.drawable.ic_launcher);
    3. mToolbar.setTitle("主标题");
    4. mToolbar.setSubtitle("副标题");
    5. setSupportActionBar(mToolbar);

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

    1. <menu xmlns:android="http://schemas.android.com/apk/res/android"
    2. xmlns:app="http://schemas.android.com/apk/res-auto"
    3. xmlns:tools="http://schemas.android.com/tools"
    4. tools:context=".MainActivity" >
    5.  
    6. <item
    7. android:id="@+id/ab_search"
    8. android:orderInCategory="80"
    9. android:title="action_search"
    10. app:actionViewClass="android.support.v7.widget.SearchView"
    11. app:showAsAction="ifRoom"/>
    12. <item
    13. android:id="@+id/action_share"
    14. android:orderInCategory="90"
    15. android:title="action_share"
    16. app:actionProviderClass="android.support.v7.widget.ShareActionProvider"
    17. app:showAsAction="ifRoom"/>
    18. <item
    19. android:id="@+id/action_settings"
    20. android:orderInCategory="100"
    21. android:title="action_settings"
    22. app:showAsAction="never"/>
    23.  
    24. </menu>

    一个典型的Toolbar在程序中的显示效果如图12.29所示。

    12.9 Toolbar - 图1 图12.29 Toolbar

    通过setSupportActionBar()方法,可以用Toolbar模拟出Actionbar的效果。下面我们将Toolbar与DrawerLayout结合起来,向大家演示Android 5.X中DrawerToggle状态变化的动态效果,即最左边的Toggle在DrawerLayout滑动时,会从三条横线渐变成一个箭头状的图案。

    首先,在布局文件中引入DrawerLayout,并为其设置显示的内容,代码如下所示。

    1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    2. xmlns:tools="http://schemas.android.com/tools"
    3. android:layout_width="match_parent"
    4. android:layout_height="match_parent"
    5. android:orientation="vertical"
    6. tools:context=".MainActivity">
    7.  
    8. <include layout="@layout/toolbar" />
    9.  
    10. <android.support.v4.widget.DrawerLayout
    11. android:id="@+id/drawer"
    12. android:layout_width="match_parent"
    13. android:layout_height="match_parent" >
    14.  
    15. <!--内容界面-->
    16. <LinearLayout
    17. android:layout_width="match_parent"
    18. android:layout_height="match_parent"
    19. android:background="@android:color/holo_blue_light" android:orientation="vertical" >
    20. <Button
    21. android:layout_width="100dp"
    22. android:layout_height="match_parent"
    23. android:text="内容界面"/>
    24. </LinearLayout>
    25.  
    26. <!--侧滑菜单内容必须指定其水平重力-->
    27. <LinearLayout
    28. android:id="@+id/drawer_view"
    29. android:layout_width="match_parent"
    30. android:layout_height="match_parent"
    31. android:layout_gravity="start"
    32. android:orientation="vertical" >
    33. <Button
    34. android:layout_width="200dp"
    35. android:layout_height="match_parent"
    36. android:text="菜单界面"/>
    37. </LinearLayout>
    38. </android.support.v4.widget.DrawerLayout>
    39. </LinearLayout>

    接下来,在Activity中使用如下所示代码即可实现该效果。

    1. getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    2. mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer);
    3. mDrawerToggle = new ActionBarDrawerToggle(
    4. this, mDrawerLayout, mToolbar,
    5. R.string.abc_action_bar_home_description,
    6. R.string.abc_action_bar_home_description_format);
    7. mDrawerToggle.syncState();
    8. mDrawerLayout.setDrawerListener(mDrawerToggle);

    程序运行效果如图12.30所示,展开效果如图12.31所示。

    12.9 Toolbar - 图2 12.9 Toolbar - 图3
    图12.30 DrawerLayout展开效果 图12.31 DrawerLayout展开效果