Android第二十一天Menu
Menu :
概念:
1、Android应用中的菜单默认是隐藏的,只有当用户点击手机上的MENU键,系统才会显示菜单。这种菜单叫做选项菜单(Option Menu)。
2、从3.0开始,Android不要求手机设备上必须提供MENU按键。因此Android推荐使用ActionBar来代替Menu。
分类:
1.OptionsMenu 按手机Menu弹出的菜单,选项菜单
2.ContextMenu 长按绑定UI控件弹出的菜单
3.PopupMenu 指在UI控件的上方或者下方弹出的菜单,与UI控件绑定
OptionsMenu:
一、重写
在Activity中重写方法:创建一个上下文菜单
public boolean onCreateOptionsMenu(Menu menu) {
在Activity中重写方法:上下文菜单项监听
public boolean onOptionsItemSelected(MenuItem item) {
二、添加菜单项:
1.代码添加:
/** * 在Activity中重写该方法 :创建选项菜单 * * @param menu * @return */ @Override public boolean onCreateOptionsMenu(Menu menu) { /** * Menu 菜单: * add方法 参数1:GroupId 分组Id * 参数2: 当前条目的id * 参数3: 顺序 * 参数4: 显示的文本 */ MenuItem item0 = menu.add(1, 0, 0, "改变字体大小"); item0.setIcon(R.mipmap.ic_launcher);//该效果可能显示不出来 item0.setTitle("呵呵");//替代add方法中的第四个参数 MenuItem item1 = menu.add(1, 1, 0, "改变字体颜色"); MenuItem item2 = menu.add(1, 2, 0, "改变文本"); MenuItem item3 = menu.add(1, 3, 0, "改变背景色"); return super.onCreateOptionsMenu(menu); }
2.布局添加:
在res/menu/文件夹下创建xml资源文件: 右键res创建directory命名为menu:
定义菜单资源:
根标签必须是menu
<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"> <!--title 是必须必备的属性--> <item android:id="@+id/item1" android:title="如果有空间" android:icon="@mipmap/ic_launcher" android:orderInCategory="2" app:showAsAction="ifRoom"></item> <item android:id="@+id/item2" android:title="在0" app:showAsAction="always"></item> <item android:id="@+id/item21" android:title="在1" app:showAsAction="always"></item> <item android:id="@+id/item22" android:title="在3" app:showAsAction="always"></item> <item android:id="@+id/item23" android:title="在2" app:showAsAction="always"></item> <item android:id="@+id/item3" android:title="不再" app:showAsAction="never"></item> </menu>
showAsAction说明:
在布局中调用
/** * 在Activity中重写该方法 :创建选项菜单 * * @param menu * @return */ @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu1,menu); return super.onCreateOptionsMenu(menu); }
3. 监听器:在重写方法中进行
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case 0: //改变字体大小 showTv.setTextSize(50); break; case 1: //改变字体颜色 showTv.setTextColor(Color.BLUE); break; case 2: //改变文本 showTv.setText("王智勇,你将不是我的大宝贝了!"); break; case 3: //改变背景 showTv.setBackgroundColor(Color.MAGENTA); break; case R.id.item21: Toast.makeText(this, "你在吗1", Toast.LENGTH_SHORT).show(); break; case R.id.item22: Toast.makeText(this, "你在吗2", Toast.LENGTH_SHORT).show(); break; case R.id.item23: Toast.makeText(this, "你在吗3", Toast.LENGTH_SHORT).show(); break; case R.id.item1: Toast.makeText(this, "你在吗4", Toast.LENGTH_SHORT).show(); break; } return super.onOptionsItemSelected(item); }
ContextMenu:上下文菜单
概念:当长按某个UI视图的时候弹出显示的菜单!使用的时候需要首先调用方法:
//一定要注册 为这个视图注册 注册时候 长按这个视图的时候就会打开上下文菜单
registerForContextMenu(showTv);
一、重写方法:需要注意:OptionsMenu重写的是onCreateOptionsMenu 与这个不同!
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
public boolean onContextItemSelected(MenuItem item) {
二、添加菜单项:
1.代码添加:
/** * 创建 上下文菜单 * * @param menu * @param v * @param menuInfo */ @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); /** * 在代码中动态添加菜单选项 * 参数1 GroupId * 参数2 当前的 选项的id * 参数3 顺序 可以使用0 也可以用 Menu.NONE * 参数4 显示的标题 */ menu.add(1, 1, Menu.NONE, "改变背景"); menu.add(1, 2, 0, "切换页面"); //动态的添加子菜单 SubMenu subMenu = menu.addSubMenu("我有子菜单"); //向子菜单中添加选择项 subMenu.add(2, 3, 0, "王智勇"); subMenu.add(2, 4, 0, "放学别走"); subMenu.add(2, 5, 0, "操场等我!"); }
2.资源文件添加:在res/menu文件夹下创建资源menu1.xml
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/item_size" android:title="改变字体大小"></item> <item android:id="@+id/item_color" android:title="改变字体颜色"></item> <!--子菜单--> <item android:id="@+id/item_child" android:title="打开子菜单"> <menu> <item android:id="@+id/item_child1" android:title="子菜单1"></item> <item android:id="@+id/item_child2" android:title="子菜单2"></item> </menu> </item> </menu>
在代码中需要调用:
@Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); //将Menu的文件加载到上下文菜单对象 getMenuInflater().inflate(R.menu.menu1, menu); }
3.监听器 :
/** * 监听上下文菜单的点击事件 * * @param item * @return */ @Override public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.item_size: showTv.setTextSize(30); break; case R.id.item_color: showTv.setTextColor(Color.CYAN); break; case R.id.item_child1: Toast.makeText(this, "这是子菜单1", Toast.LENGTH_SHORT).show(); break; case R.id.item_child2: Toast.makeText(this, "这是子菜单2", Toast.LENGTH_SHORT).show(); break; case 1: //改变背景 showTv.setBackgroundColor(Color.MAGENTA); break; case 2: //切换页面 Toast.makeText(this, "切换页面", Toast.LENGTH_SHORT).show(); Intent intent = new Intent(this, SecondActivity.class); startActivity(intent); break; case 3: Toast.makeText(this, "王智勇", Toast.LENGTH_SHORT).show(); break; case 4: Toast.makeText(this, "放学你别走", Toast.LENGTH_SHORT).show(); break; case 5: Toast.makeText(this, "操场等我", Toast.LENGTH_SHORT).show(); break; } return super.onContextItemSelected(item); }
ListView结合ContextMenu使用:
private ListView listView; private List<String> list = new ArrayList<>(); private ArrayAdapter<String> adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); //初始化数据 initData(); //初始化视图 listView = (ListView) findViewById(R.id.listView); adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, list); listView.setAdapter(adapter); //注册 listView registerForContextMenu(listView); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); menu.add(1, 0, 0, "添加一条数据"); menu.add(1, 1, 0, "删除一条数据"); menu.add(1, 2, 0, "修改一条数据"); menu.add(1, 3, 0, "查询一条数据"); } @Override public boolean onContextItemSelected(MenuItem item) { // 根据MenuItem获取MenuInfo对象并强制类型转换成为AdapterContextMenuInfo AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo(); //根据AdapterContextMenuInfo的position属性来获取当前长按第几个条目弹出的菜单 int position = menuInfo.position; switch (item.getItemId()) { case 0: //增加一条数据 list.add(position, "我是一条增加的数据"); adapter.notifyDataSetChanged(); break; case 1: //删除一条数据 list.remove(position); adapter.notifyDataSetChanged(); break; case 2: //修改一条数据 list.set(position, "我是一条修改后的数据"); adapter.notifyDataSetChanged(); break; case 3: //查询一条数据 Toast.makeText(this, list.get(position), Toast.LENGTH_SHORT).show(); break; } return super.onContextItemSelected(item); } //初始化数据 private void initData() { for (int i = 0; i < 100; i++) { list.add("这是第: " + i + " 条数据"); } }
PopupMenu:
指在UI控件的上方或者下方弹出的菜单,与UI控件绑定
//实例化弹出菜单对象 参数2表示的是与那个视图的位置进行绑定 PopupMenu popupMenu = new PopupMenu(this, showBt); //获取弹出菜单对象 Menu menu = popupMenu.getMenu(); menu.add(1, 0, 0, "添加"); menu.add(1, 1, 0, "删除"); //设置菜单监听器 popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case 0: Toast.makeText(MainActivity.this, "添加", Toast.LENGTH_SHORT).show(); break; case 1: Toast.makeText(MainActivity.this, "删除", Toast.LENGTH_SHORT).show(); break; } return false; } }); //将菜单对象展示出来 popupMenu.show(); //将菜单对象消失 // popupMenu.dismiss();