关于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) {
finish();
}
});
5、showAsAction属性
用来指定菜单项如何在动作栏中显示
值 | 定义 |
always | 总是在动作栏中显示 |
never | 永不在动作栏中显示 |
ifRoom | 有足够的控件就独立显示在动作栏中 |
withText | 显示title属性的值,可以和其他值一起使用 |
collapseActionView | 可伸缩的 |
二、上下文菜单ContextMenu
(一)创建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弹出菜单
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();
}
});
}
}