Android入门之Menu组件的使用教程详解
TGITCIC 人气:4简介
Android有不同的菜单:
- 系统菜单
- 弹出菜单(可自定义样式)
- Context Menu;
- 子菜单;
菜单的使用和我们前面说的AlertDialog很像。它可以支持自定义样式、也可以对菜单的点击事件进行绑定。
Android里有几个MainActivity事件可以覆盖,其中有以下几个事件就是用于处理Menu的。
- onCreateOptionsMenu(Menu menu),在这个方法里如果你使用menu.add就可以实现在Android的手机里右上角的...图标点击出现系统菜单的效果;
- onOptionsItemSelected(MenuItem item),这个方法里可以进行每个系统菜单项点击的处理事件;
- onCreateContextMenu(ContextMenu menu, View v,ContextMenu.ContextMenuInfo menuInfo) ,这个是用来创建ContextMenu的,即这个菜单可以绑定在一个组件上,比如说按一下一个组件,对于这个组件的菜单就会被弹出。但是它要启作用必须在程序运行开始时调用一下Activity里的自带方法:registerForContextMenu(View view);来指定,ContextMenu绑定在哪个组件的身上;
- onContextItemSelected(MenuItem item),相应的对于ContextMenu的每一个item的点击处理方法,用户可以自定义和覆盖里面的逻辑;
课程目标
- 做一个可以改变屏幕中间TextView字体颜色的系统菜单;
- 点一下按钮弹出一个PopMenu;
- 对于一个TextView绑定一个ContextMenu;
代码
前端代码
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <TextView android:id="@+id/viewContext" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_marginTop="20dp" android:text="长按出context menu" android:textSize="18sp" /> <TextView android:id="@+id/textColor" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="选择菜单改变颜色" android:textSize="18sp" /> <Button android:id="@+id/btnShowMenu" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textColor" android:layout_centerHorizontal="true" android:layout_marginTop="10dp" android:text="展示弹出菜单" /> </RelativeLayout>
系统菜单
前端代码
不需要
后端代码
MainActivity.java
系统菜单涉及到两个方法的覆盖,因此只要在这两个方法把系统菜单设上,同时对系统菜单的“选择”事件做出自定义即可,在此我们通过系统菜单改变屏幕中一行字的字体颜色
//1.定义不同颜色的菜单项的标识: private final int RED = 101; private final int GREEN = 102; private final int BLUE = 103; private final int YELLOW = 104; private final int GRAY = 105; private final int CYAN = 106; private final int BLACK = 107; @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. menu.add(1, RED, 4, "红色"); menu.add(1, GREEN, 2, "绿色"); menu.add(1, BLUE, 3, "蓝色"); menu.add(1, YELLOW, 1, "黄色"); menu.add(1, GRAY, 5, "灰色"); menu.add(1, CYAN, 6, "蓝绿色"); menu.add(1, BLACK, 7, "黑色"); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); switch (id) { case RED: textColor.setTextColor(Color.RED); break; case GREEN: textColor.setTextColor(Color.GREEN); break; case BLUE: textColor.setTextColor(Color.BLUE); break; case YELLOW: textColor.setTextColor(Color.YELLOW); break; case GRAY: textColor.setTextColor(Color.GRAY); break; case CYAN: textColor.setTextColor(Color.CYAN); break; case BLACK: textColor.setTextColor(Color.BLACK); break; } return super.onOptionsItemSelected(item); }
弹出菜单
前端代码
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/mcat" android:title="一只喵" /> <item android:id="@+id/mdog" android:title="一只汪" /> </menu>
后端代码
btnShowMenu.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { PopupMenu popup = new PopupMenu(MainActivity.this,btnShowMenu); popup.getMenuInflater().inflate(R.menu.pop_menu, popup.getMenu()); popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()){ case R.id.mcat: Toast.makeText(MainActivity.this,"你轻拍了一下喵", Toast.LENGTH_SHORT).show(); break; case R.id.mdog: Toast.makeText(MainActivity.this,"你轻拍了一下汪", Toast.LENGTH_SHORT).show(); break; } return true; } }); popup.show(); } }); }
ContextMenu
前端
context_menu.xml
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:checkableBehavior="none"> <item android:id="@+id/blue" android:title="@string/font_blue"/> <item android:id="@+id/green" android:title="@string/font_green"/> <item android:id="@+id/red" android:title="@string/font_red"/> </group> </menu>
后端
我们可以看到这个ContextMenu是绑定在一个TextView上的。
viewContext=(TextView)findViewById(R.id.viewContext); registerForContextMenu(viewContext); //重写上下文菜单的创建方法 @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { MenuInflater inflator = new MenuInflater(this); inflator.inflate(R.menu.context_menu, menu); super.onCreateContextMenu(menu, v, menuInfo); } //上下文菜单被点击是触发该方法 @Override public boolean onContextItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.blue: viewContext.setTextColor(Color.BLUE); break; case R.id.green: viewContext.setTextColor(Color.GREEN); break; case R.id.red: viewContext.setTextColor(Color.RED); break; } return true; } }
加载全部内容