摸鱼学Android 二十(菜单)
UI控件之十 Menu(菜单)
1 OptionMenu(选项菜单)
1.1 说明
最常见的菜单,通过Menu键来调用。
1.2 使用
- 重写onCreateOptionsMenu()方法,完成菜单初始化
- 重写onOptionsItemSelected()方法,完成事件处理
1.3 实例
- 创建菜单,点击对应项改变文本颜色
public class MainActivity extends AppCompatActivity {
//1.定义不同颜色的菜单项的标识:
final private int RED = 110;
final private int GREEN = 111;
final private int BLUE = 112;
final private int YELLOW = 113;
final private int GRAY= 114;
final private int CYAN= 115;
final private int BLACK= 116;
private TextView tv_test;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_test = (TextView) findViewById(R.id.textView);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
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:
tv_test.setTextColor(Color.RED);
break;
case GREEN:
tv_test.setTextColor(Color.GREEN);
break;
case BLUE:
tv_test.setTextColor(Color.BLUE);
break;
case YELLOW:
tv_test.setTextColor(Color.YELLOW);
break;
case GRAY:
tv_test.setTextColor(Color.GRAY);
break;
case CYAN:
tv_test.setTextColor(Color.CYAN);
break;
case BLACK:
tv_test.setTextColor(Color.BLACK);
break;
}
return super.onOptionsItemSelected(item);
}
}
2.运行App
2 ContextMenu(上下文菜单)
2.1 说明
长按View出现的菜单。
2.2 使用
- 重写onCreateContextMenu()方法,完成菜单初始化
- 使用registerForContextMenu()方法,为view组件注册上下文菜单
- 重写onContextItemSelected()方法,完成事件处理
2.3 实例
复用上面的代码
- 创建上下文菜单资源文件context_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 定义一组单选按钮 -->
<!-- checkableBehavior的可选值由三个:single设置为单选,all为多选,none为普通选项 -->
<!-- 将字符串定义在strings.xml中是个好习惯 -->
<group android:checkableBehavior="none">
<item android:id="@+id/blue" android:title="蓝色"/>
<item android:id="@+id/green" android:title="绿色"/>
<item android:id="@+id/red" android:title="红色"/>
</group>
</menu>
- 创建上下文菜单,以及为textView注册上下文菜单
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_test = (TextView) findViewById(R.id.textView);
registerForContextMenu(tv_test);
}
@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);
registerForContextMenu(tv_test);
}
//上下文菜单被点击是触发该方法
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.blue:
tv_test.setTextColor(Color.BLUE);
break;
case R.id.green:
tv_test.setTextColor(Color.GREEN);
break;
case R.id.red:
tv_test.setTextColor(Color.RED);
break;
}
return true;
}
- 运行App,长按文本
3 SubMenu(子菜单)
3.1 说明
子菜单即在菜单中又嵌套一层菜单。
3.2 使用
- 和上下文菜单用法一致,区别在于后者是2层< menu >
- 也可以使用menu.addSubMenu()方法进行子菜单的添加,还需另外再subMenu.add()方法添加菜单项
3.3 实例
复用上面的代码
- 添加子菜单和菜单项
@Override
//重写上下文菜单的创建方法
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
MenuInflater inflator = new MenuInflater(this);
inflator.inflate(R.menu.context_menu, menu);
SubMenu file = menu.addSubMenu("文件");
file.add("文件1");
file.add("文件2");
file.add("文件3");
super.onCreateContextMenu(menu, v, menuInfo);
}
- 运行App,长按文本,可以看到文件选项(有个小三角),点进去显示:
4 PopupMenu(弹出式菜单)
4.1 说明
类似PopupWindow,菜单选项可以来自Menu资源。
4.2 使用
- 构造函数创建菜单
- 菜单初始化以及点击事件
4.3 实例
- 创建菜单资源menu_pop.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/option1" android:title="选项1" />
<item android:id="@+id/option2" android:title="选项2" />
</menu>
- 创建显示菜单方法
public void showPopMenu(View view) {
PopupMenu popup = new PopupMenu(MainActivity.this, view);
popup.getMenuInflater().inflate(R.menu.menu_pop, popup.getMenu());
popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()){
case R.id.option1:
Toast.makeText(MainActivity.this,"你点了选项1~",
Toast.LENGTH_SHORT).show();
break;
case R.id.option2:
Toast.makeText(MainActivity.this,"你点了选项2~",
Toast.LENGTH_SHORT).show();
break;
}
return true;
}
});
popup.show();
}
- 新增按钮,绑定上面方法
- 运行App,点击按钮