Android菜单与标题栏

    |     2016年6月7日   |   Android UI界面   |     0 条评论   |    2846

Android 界面分成状态栏、标题栏、内容区;菜单则有选项菜单 OptionMenu、上下文菜单 ContextMenu、弹出菜单 PopupMenu。下面把标题栏从 ActionBar 收到 Toolbar,并配上选项菜单。


一、窗口三块与菜单三类

uiwindow

Android 2.3 之前,标题栏主要标识当前页面。3.0 起标题栏加上导航和动作:原先主要由选项菜单完成的操作,被收到标题栏上,叫做动作栏 ActionBar。

ActionBar 不够灵活,Android 5.0 用 Toolbar 取代它。默认外观差不多,但 Toolbar 像普通控件一样放进布局,系统条条框框更少。默认 Toolbar 替换 ActionBar 后大致是这样:

toolbar_icon

结论:ActionBar 和 Toolbar 都能做标题栏,现在的标题栏负责导航、当前位置和动作;动作与以前的选项菜单兼容。

组件 出现 怎么用
OptionMenu 早期标题栏之外 菜单项,后来动作被收到栏上
ActionBar Android 3.0 系统定制多,改起来死板
Toolbar Android 5.0 / AppCompat 当控件用,主题、图标、菜单都更自由

二、Toolbar 布局

主题用 Theme.AppCompat.Light.NoActionBar,自己在布局里放 Toolbar:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <android.support.v7.widget.Toolbar
        android:id="@+id/my_toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/colorPrimaryDark"
        app:title="标题"
        app:titleTextColor="@android:color/white"
        app:logo="@mipmap/my_ic_launcher"
        app:navigationIcon="@drawable/actionbar_up_indicator"
        app:subtitle="工具条"
        app:subtitleTextColor="@android:color/white"
        app:popupTheme="@style/MyToolBarPopupMenuStytle"/>
</RelativeLayout>

三、选项菜单 XML

showAsAction 为 ifRoom 时,有空位就显示在栏上;不够就进溢出菜单。子 <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/my_option_add"
        android:icon="@android:drawable/ic_menu_search"
        app:showAsAction="ifRoom"
        android:title="添加" />
    <item
        android:id="@+id/my_option_delete"
        android:icon="@android:drawable/ic_input_add"
        app:showAsAction="ifRoom"
        android:title="删除" />
    <item
        android:id="@+id/my_option_update"
        android:icon="@android:drawable/ic_menu_share"
        app:showAsAction="ifRoom"
        android:title="编辑" >
        <menu>
            <item android:title="修改" >
                <menu>
                    <item android:title="三级菜单项"/>
                </menu>
            </item>
            <item android:title="设置"/>
        </menu>
    </item>
</menu>

四、代码绑定点击

用 inflateMenu 挂菜单,setOnMenuItemClickListener 处理项点击,setNavigationOnClickListener 处理左侧返回:

public class ToolBarActivity extends AppCompatActivity {
    public Toolbar mToolbar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tool_bar_layout);
        mToolbar = (Toolbar) findViewById(R.id.my_toolbar);

        mToolbar.inflateMenu(R.menu.my_option_menu);
        mToolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem item) {
                switch (item.getItemId()){
                    case R.id.my_option_add:
                        Toast.makeText(ToolBarActivity.this,"添加成功",Toast.LENGTH_SHORT).show();
                        break;
                    case R.id.my_option_delete:
                        Toast.makeText(ToolBarActivity.this,"删除成功",Toast.LENGTH_SHORT).show();
                        break;
                }
                return false;
            }
        });

        mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(ToolBarActivity.this,"返回",Toast.LENGTH_SHORT).show();
                finish();
            }
        });
    }

五、主题:溢出菜单不挡栏

overlapAnchor=false 让溢出菜单不盖住 Toolbar;actionOverflowButtonStyle 换三点图标;popup 主题管字号、字色、背景:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="MyToolbarTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!--设置menu菜单不遮挡toolbar-->
        <item name="actionOverflowMenuStyle">@style/MyOverflowMenuStyle</item>
        <!--配置Menu的图标-->
        <item name="actionOverflowButtonStyle">@style/MyOverflowMenuButtonStyle</item>
    </style>

    <style name="MyOverflowMenuStyle" parent="Widget.AppCompat.Light.PopupMenu.Overflow">
        <item name="overlapAnchor">false</item>
    </style>

    <style name="MyOverflowMenuButtonStyle" parent="Widget.AppCompat.Light.ActionButton.Overflow">
        <item name="android:src">@drawable/ic_menu_more_off</item>
    </style>

    <style name="MyToolBarPopupMenuStytle" parent="Widget.AppCompat.Light.PopupMenu">
        <!--<item name="android:drawableLeft">@android:drawable/ic_input_add</item>-->
        <!-- 设置Menu菜单的字体大小-->
        <item name="android:textSize">18sp</item>
        <!-- 设置Menu菜单的字体色-->
        <item name="android:textColorPrimary">@android:color/background_dark</item>
        <!-- 设置Menu菜单的背景色-->
        <item name="android:itemBackground">@android:color/white</item>
    </style>
</resources>

效果:

toolbar1 toolbar2

关于 ActionBar 和 Toolbar 的具体使用可以参考:

一句话总结:标题栏用 Toolbar 当控件来放,菜单用 XML + inflateMenu,主题里把溢出菜单挪开、换图标和配色即可。

转载请注明来源:Android菜单与标题栏
本文链接地址:https://ai.zhousir.top/?p=1610
回复 取消