本文在同一Activity中介绍添加Menu(菜单)的几种方法,以及对点击菜单选项的事件处理方法
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add("1");//直接用add添加名为“1”的菜单,无需配置menu文件
menu.add("2");
new MenuInflater(this).inflate(R.menu.main_menu,menu);//通过已经创建好的menu文件来添加菜单
return true;
}
/*通过反射来调用显示icon的方法使得menu的icon正常显示出来*/
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
if(menu != null){
if(menu.getClass() == MenuBuilder.class){
try{
Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible",Boolean.TYPE);
m.setAccessible(true);
m.invoke(menu,true);
}catch(Exception e){e.printStackTrace();}
}
}return super.onMenuOpened(featureId,menu);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
//通过getItemId()方法来获取点击菜单的Id来进行判断
if(item.getItemId()==R.id.item1){Toast.makeText(this,"click item1",Toast.LENGTH_SHORT).show();}
//通过getTitle()方法来获取点击菜单的Id的字符串来进行判断
if(item.getTitle().toString()=="2"){Toast.makeText(this,"cilck 2",Toast.LENGTH_SHORT).show();}
//通过getTitle()方法来取得所选(点击)的菜单选项的对应id,并通过toString()方法转换成字符串
switch(item.getTitle().toString()){
case "1":
Toast.makeText(this,"click 1",Toast.LENGTH_SHORT).show();
break;
default:
break;
}return true;
}
}
下面这段代码是添加菜单到Activity中的两种用法:
menu.add("1");//直接用add添加名为“1”的菜单,无需配置menu文件
new MenuInflater(this).inflate(R.menu.main_menu,menu);//通过已经创建好的menu文件来添加菜单
下面这段代码是获取点击菜单选项来作对应判断的几种用法:
//通过getItemId()方法来获取点击菜单的Id来进行判断
if(item.getItemId()==R.id.item1){Toast.makeText(this,"click item1",Toast.LENGTH_SHORT).show();}
//通过getTitle()方法来获取点击菜单的Id的字符串来进行判断
if(item.getTitle().toString()=="2"){Toast.makeText(this,"cilck 2",Toast.LENGTH_SHORT).show();}
//通过getTitle()方法来取得所选(点击)的菜单选项的对应id,并通过toString()方法转换成字符串
switch(item.getTitle().toString())
如下图所示,1、2两个选项是通过add添加的,而菜单1、2、3是通过menu文件的配置来添加进去的
在配置菜单进行输出时,会出现菜单的图标不显示的情况,这是因为系统默认为私有,需要使用反射来进行显示的调用
/*通过反射来调用显示icon的方法使得menu的icon正常显示出来*/
@Override
public boolean onMenuOpened(int featureId, Menu menu) {
if(menu != null){
if(menu.getClass() == MenuBuilder.class){
try{
Method m = menu.getClass().getDeclaredMethod("setOptionalIconsVisible",Boolean.TYPE);
m.setAccessible(true);
m.invoke(menu,true);
}catch(Exception e){e.printStackTrace();}
}
}return super.onMenuOpened(featureId,menu);
}
MainActivity布局文件无需去看,因为我们没有在里面添加任何内容,我们只需要看menu配置文件内容即可:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/item1"
android:icon="@android:drawable/btn_star_big_on"
android:title="菜单1"
app:showAsAction="always" />
<item
android:id="@+id/item2"
android:icon="@android:drawable/btn_star_big_on"
android:title="菜单2"
app:showAsAction="always" />
<item
android:id="@+id/item3"
android:icon="@android:drawable/btn_star_big_on"
android:title="菜单3"
app:showAsAction="always" />
</menu>