动作栏和选项菜单
2016-06-06 22:03
585 查看
关于Menu菜单
官方API给出的定义是 By default, every Activity supports an options menu of actions or options.默认情况下一个Activity都支持一个选项菜单的操作.Android中菜单分为三种:选项菜单 上下文菜单 弹出菜单
一、选项菜单
(一)创建Menu(可以通过手机硬件的Menu键弹出菜单)
通过重写onCreateOptionsMenu(Menu menu)方法.1、纯代码实现
public class MenuActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_menu_layout); } @Override public boolean onCreateOptionsMenu(Menu menu) { //添加菜单项 menu.add(1, 100, 1, "纯代码"); //参数为int groupId 组Id,int itemId 项ID 后面相关事件处理时会用到, // int order 根据order进行位置的排序,CharSequence title 标题 menu.add(1, 101, 2, "实现"); return super.onCreateOptionsMenu(menu); } }
2、通过MenuInflater解析XML
①在Res\menu文件夹中新建menu.xml文件<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/action1" android:title="MenuInflater" /> <item android:id="@+id/action2" android:title="实现" /> </menu>②重写onCreateOptionsMenu()方法,通过MenuInflater加载解析上面的menu.xml文件
public class MenuActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_menu_layout); } @Override public boolean onCreateOptionsMenu(Menu menu) { //============通过getMenuInflater实例化MenuInflater MenuInflater menuInflater = getMenuInflater(); //============菜单解析器MenuInflater加载解析munu.xml文件 menuInflater.inflate(R.menu.mymenu, menu); return super.onCreateOptionsMenu(menu); } }
(二)ActionBar与OptionMenu
ActionBar在android5.0之后被ToolBar取代,用法与ToolBar类似(三)ToolBar与OptionMenu
1、ToolBar工具栏
继承自Viewgroup,所以使用它时可以在XML中直接添加.使用ToolBar可以使在不同Android版本下标题栏表现形式相同
2、ToolBar与ActionBar
ToolBar相对于ActionBar,自定义的空间更加充足,方便3、设置OptionMenu在标题栏中显示
①要使用ToolBar时,需要在相应的Activity中的Theme(主题)中<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">的parent属性设置为NoActionBar②在布局文件中直接添加ToolsBar并设置属性
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="wrap_content"> <android.support.v7.widget.Toolbar android:id="@+id/my_toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" app:logo="@drawable/logo" app:navigationIcon="@drawable/home" app:subtitle="Menu" app:title="ToolBar" /> </LinearLayout>
需要注意的地方:
Toolbar是5.0加入的,如果需要兼容5.0以下的版本 要使用support.v7.widget包下的Toolbar
设置logo navigationIcon等Toolbar特有属性时需要添加命名控件xmlns:app="http://schemas.android.com/apk/res-auto"
③新建menu.mxl文件,与上面新建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/action1" android:title="action1" app:showAsAction="always" /> <item android:id="@+id/action2" android:title="action2" /> </menu>
showAsAction属性会在后面介绍
④重写onCreateOptionsMenu()方法,通过实例化ToolBar并调用InflaterMenu解析加载menu.xml文件
public class MenuActivity extends AppCompatActivity { Toolbar mMyToolBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_menu_layout); mMyToolBar = (Toolbar) findViewById(R.id.my_toolbar); mMyToolBar.inflateMenu(R.menu.mymenu); }
4、相关事件处理
setOnMenuItemClickListener()菜单项点击事件监听mMyToolBar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { //===通过获取item的id判断是哪个项在进行操作 switch (item.getItemId()) { case R.id.action1: Toast.makeText(getApplicationContext(), "Action1进行操作", Toast.LENGTH_SHORT).show(); case R.id.action2: Toast.makeText(getApplicationContext(), "Action2进行操作", Toast.LENGTH_SHORT).show(); } return false; } });setNavigationOnclickListener() 导航键点击事件监听
mMyToolBar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { 4000 finish(); } });
5、showAsAction属性
用来指定菜单项如何在动作栏中显示值 | 定义 |
always | 总是在动作栏中显示 |
never | 永不在动作栏中显示 |
ifRoom | 有足够的控件就独立显示在动作栏中 |
withText | 显示title属性的值,可以和其他值一起使用 |
collapseActionView | 可伸缩的 |
二、上下文菜单ContextMenu
通过长按视图控件View弹出的Menu(一)创建ContextMenu
public class ContextMenuActivity extends AppCompatActivity { ListView mMyListView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_context_menu_layout); mMyListView = (ListView) findViewById(R.id.mylistview); //创建数据源 String[] list = new String[]{"option1", "option2", "option3"}; //创建适配器,管理数据源list ArrayAdapter arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_expandable_list_item_1, list); //View加载适配器,适配器关联View和数据源使用View显示数据源list数据 mMyListView.setAdapter(arrayAdapter); registerForContextMenu(mMyListView); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); //每次长按View时都会调用onCreatContextMenu()方法 Log.v("ContextMenu", "创建成功"); //获取菜单解析器MenuInflater实例 MenuInflater menuInflater = getMenuInflater(); //解析器加载解析menu.xml文件 menuInflater.inflate(R.menu.mymenu, menu); } }
三、PopupMenu弹出菜单
PopupMenu是依附于视图控件View的模式菜单(一)创建PopupMenu
public class PopupMenuActivity extends AppCompatActivity { Button mMyPopupMenu; PopupMenu popupMenu; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_popup_menu_layout); mMyPopupMenu = (Button) findViewById(R.id.mypopupmenu); popupMenu = new PopupMenu(this, mMyPopupMenu); //PopupMenu.inflate内部封装了getMenuInflater().inflate(menuRes, mMenu); //加载解析menu.xml文件 popupMenu.inflate(R.menu.mymenu); mMyPopupMenu.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //显示PopupMenu菜单 popupMenu.show(); } }); } }
相关文章推荐
- 今天大概了解了一下百度的点击率
- java中的构造器
- 分析函数调用关系图(call graph)的几种方法
- 分析函数调用关系图(call graph)的几种方法
- 在vim中使用cscope查找调用、定义函数和变量的地方
- C++ 笔记1: 字符串操作1
- Chapter 1. 数据库(介绍、主键、外键)
- 链表的倒数第K个结点--双指针
- BigDecimal处理金额
- [leetcode]283. Move Zeroes
- android dp、sp、px、pt
- 微软Power BI技术文章与资源目录
- DIRECT3D状态详解
- poj 3041 Asteroids (二分图匹配)
- vnc server配置、启动、重启与连接
- iOS-监听UITextField值改变事件
- 写作业时应不应该看答案?
- 拉链表
- java设计模式之抽象工厂模式学习
- mysql常用基础操作语法(一)~~对库的操作【命令行模式】