Android Toolbar

在这里插入图片描述

参考:Toolbar样式

  • layout activity_main.xml
<?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"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context="com.example.toolbar.MainActivity">

    <!--默认使用系统ActionBar的高度-->
    <!--android:layout_height="?attr/actionBarSize"-->
    <!--设置toolbar背景色(引用系统的ActionBar背景色)-->
    <!--android:background="?attr/colorPrimary"-->
    <!--除了宽高外,其他属性最好使用自定义命名空间来设置,如app:logo等-->

    <!--设置溢出菜单样式-->
    <!--app:popupTheme-->
    <!--@style/ThemeOverlay.Appcompat.Dark 黑底白字-->
    <!--@style/ThemeOverlay.Appcompat.Light 白底黑字-->

    <!--设置标题栏样式-->
    <!--app:theme-->
    <!--@style/ThemeOverlay.Appcompat.Dark 黑底白字-->
    <!--@style/ThemeOverlay.Appcompat.Light 白底黑字-->

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:logo="@mipmap/ic_launcher"
        app:title="title"
        app:subtitle="subtitle"
        app:navigationIcon="@mipmap/ic_launcher"
        app:theme="@style/AppTheme"
        app:popupTheme="@style/CustomStyle">
    </android.support.v7.widget.Toolbar>

    <!--toolbar是继承自ViewGroup,所以可以作为一个容器使用,在里面设置控件-->
    <!--<android.support.v7.widget.Toolbar-->
        <!--android:id="@+id/toolbar"-->
        <!--android:layout_width="match_parent"-->
        <!--android:layout_height="?attr/actionBarSize"-->
        <!--android:background="?attr/colorPrimary">-->
        <!--<RelativeLayout-->
            <!--android:layout_width="match_parent"-->
            <!--android:layout_height="match_parent">-->
            <!--<ImageView-->
                <!--android:id="@+id/navigation"-->
                <!--android:layout_width="wrap_content"-->
                <!--android:layout_height="wrap_content"-->
                <!--android:background="@mipmap/ic_launcher"/>-->
            <!--<ImageView-->
                <!--android:id="@+id/menu"-->
                <!--android:layout_alignParentRight="true"-->
                <!--android:layout_width="wrap_content"-->
                <!--android:layout_height="wrap_content"-->
                <!--android:background="@mipmap/ic_launcher"/>-->
            <!--<EditText-->
                <!--android:id="@+id/edittext"-->
                <!--android:layout_toRightOf="@id/navigation"-->
                <!--android:layout_toLeftOf="@id/menu"-->
                <!--android:layout_width="match_parent"-->
                <!--android:layout_height="match_parent" />-->
        <!--</RelativeLayout>-->
    <!--</android.support.v7.widget.Toolbar>-->
</RelativeLayout>

  • values styles.xml
<resources>

    <!--系统默认的样式(黑色主题)-->
    <!--<style name="AppTheme" parent="Theme.AppCompat.DarkActionBar">-->
    <!--(白色主题)-->
    <!--<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">-->


    <!--溢出菜单样式,在app:popupTheme中调用-->
    <style name="CustomStyle">
        <!--该样式设置溢出菜单弹出的位置-->
        <item name="actionOverflowMenuStyle">@style/OverflowMenuStyle</item>
    </style>

    <style name="OverflowMenuStyle" parent="@style/Widget.AppCompat.Light.PopupMenu.Overflow">
        <item name="overlapAnchor">false</item>
        <item name="android:dropDownWidth">wrap_content</item>
        <item name="android:paddingRight">5dp</item>
        <item name="android:popupBackground">?attr/colorPrimary</item>
        <item name="android:dropDownVerticalOffset">10dip</item>
        <item name="android:dropDownHorizontalOffset">0dip</item>
        <!--设置toolbar溢出菜单图标颜色(三个竖点)[同时会更改subtitle的颜色]-->
        <!--不单独在xml中的app:theme或android:theme中引用OverflowMenuStyle样式,该属性不会起作用-->
        <item name="android:textColorSecondary">@android:color/holo_red_dark</item>
    </style>

    <style name="OverFlow" parent="@android:style/Widget.Holo.ActionButton.Overflow">
        <item name="android:src">@mipmap/ic_launcher</item>
    </style>

    <!--标题栏样式,在app:theme中调用-->
    <!-- Theme.AppCompat.Light.NoActionBar (不使用系统的ActionBar)-->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!--toolbar背景色-->
        <item name="colorPrimary">@color/colorPrimary</item>
        <!--状态栏背景色-->
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <!--设置溢出菜单窗体的条目文本颜色和toolbar标题颜色-->
        <item name="android:textColorPrimary">@color/colorAccent</item>
        <!--设置溢出菜单图标-->
        <item name="actionOverflowButtonStyle">@style/OverFlow</item>

        <!--Activity窗口的颜色-->
        <!--<item name="android:windowBackground">@color/material_blue_grey_800</item>-->
        <!--按钮选中或者点击获得焦点后的颜色-->
        <!--<item name="colorAccent">#00ff00</item>-->
        <!--和 colorAccent相反,正常状态下按钮的颜色-->
        <!--<item name="colorControlNormal">#ff0000</item>-->
        <!--Button按钮正常状态颜色-->
        <!--<item name="colorButtonNormal">@color/accent_material_light</item>-->
        <!--EditText 输入框中字体的颜色-->
        <!--<item name="editTextColor">@android:color/white</item>-->
    </style>

</resources>

  • values-21 styles.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!--底部导航栏底色,在API 21后才能使用-->
        <item name="android:navigationBarColor">@color/colorPrimary</item>
    </style>
</resources>

  • menu toolbar_menu.xml
<?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">

    <!--app:showAsAction属性值说明-->
    <!--always:使菜单项一直显示在ToolBar上-->
    <!--ifRoom:如果有足够的空间,这个值会使菜单项显示在ToolBar上-->
    <!--never:使菜单项永远都不出现在ToolBar上,在溢出菜单的子项中显示-->
    <!--withText:使菜单项和它的图标,菜单文本一起显示-->

    <!--android:orderInCategory-->
    <!--ActionBar里每个item的优先级,值越大优先级越低,ActionBar空间不足会以溢出菜单子项显示-->

    <item
        android:id="@+id/action_search"
        android:title="@string/app_name"
        android:icon="@mipmap/ic_launcher"
        android:orderInCategory="80"
        app:showAsAction="ifRoom"/>

    <item
        android:id="@+id/action_notification"
        android:title="@string/app_name"
        android:icon="@mipmap/ic_launcher"
        android:orderInCategory="90"
        app:showAsAction="ifRoom"/>

    <item
        android:id="@+id/action_setting"
        android:title="设置"
        android:icon="@mipmap/ic_launcher"
        android:orderInCategory="100"
        app:showAsAction="never"/>

    <item
        android:id="@+id/action_about"
        android:title="关于"
        android:icon="@mipmap/ic_launcher"
        android:orderInCategory="101"
        app:showAsAction="never"/>

</menu>

  • MainActivity.java
public class MainActivity extends AppCompatActivity {

    private Toolbar toolbar;

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

        toolbar = (Toolbar) findViewById(R.id.toolbar);
        //在style中没有引用Theme.AppCompat.Light.NoActionBar会直接报错
        setSupportActionBar(toolbar);
        //隐藏系统默认的title
//        getSupportActionBar().setDisplayShowTitleEnabled(false);
        //必须在setSupportActionBar之后才能调用
//        toolbar.setTitle("主标题");
//        toolbar.setSubtitle("副标题");
//        toolbar.setLogo(R.mipmap.ic_launcher);
//        toolbar.setNavigationIcon(android.R.drawable.ic_input_delete);

        //点击事件必须在setSupportActionBar之后才能调用
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Toast.makeText(MainActivity.this,"navigation was clicked",Toast.LENGTH_SHORT).show();
            }
        });

        toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                switch (item.getItemId()){
                    case R.id.action_search:
                        Toast.makeText(MainActivity.this,"action search",Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.action_notification:
                        Toast.makeText(MainActivity.this,"action notification",Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.action_setting:
                        Toast.makeText(MainActivity.this,"action setting",Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.action_about:
                        Toast.makeText(MainActivity.this,"action about",Toast.LENGTH_SHORT).show();
                        break;
                }
                return false;
            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.toolbar_menu,menu);
        return super.onCreateOptionsMenu(menu);
    }

    /**
     * 在该方法下调用以下代码可以让溢出菜单的条目显示图标
     * @param menu
     * @return
     */
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        if(menu!=null){
            if (menu.getClass().getSimpleName().equals("MenuBuilder")) {
                try {
                    Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
                    m.setAccessible(true);
                    m.invoke(menu, true);
                } catch (Exception e) {

                }
            }
        }

        return super.onPrepareOptionsMenu(menu);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值