Android菜单与标题栏
周sir |
2016年6月7日 |
Android UI界面 |
0 条评论 | 2846
Android 界面分成状态栏、标题栏、内容区;菜单则有选项菜单 OptionMenu、上下文菜单 ContextMenu、弹出菜单 PopupMenu。下面把标题栏从 ActionBar 收到 Toolbar,并配上选项菜单。
一、窗口三块与菜单三类

Android 2.3 之前,标题栏主要标识当前页面。3.0 起标题栏加上导航和动作:原先主要由选项菜单完成的操作,被收到标题栏上,叫做动作栏 ActionBar。
ActionBar 不够灵活,Android 5.0 用 Toolbar 取代它。默认外观差不多,但 Toolbar 像普通控件一样放进布局,系统条条框框更少。默认 Toolbar 替换 ActionBar 后大致是这样:

结论: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>
效果:

关于 ActionBar 和 Toolbar 的具体使用可以参考:
一句话总结:标题栏用 Toolbar 当控件来放,菜单用 XML + inflateMenu,主题里把溢出菜单挪开、换图标和配色即可。
转载请注明来源:Android菜单与标题栏
我是周sir,这是我的博客。致力于分享我学会的技术和优秀的文章。微信公众号 “周sir专栏” 欢迎大家关注。