Android里有很多菜单,比如弹出式菜单、上下文菜单和选项菜单(选项式菜单将在下一篇讲解)
menu不像其他控件一样可以在activity_main.xml布局文件里直接使用标签创建,而是在res/menu目录下新建一个xml文件
创建方法:鼠标右键单击res文件夹,New—>Android Resource Directory—>(Resource type)menu—>ok
然后在menu文件夹下新建 Menu Resource File,即可新建menu文件
下面我来一一介绍这几种菜单
一、弹出式菜单:PopupMenu
弹出式菜单需要有绑定的View,当触发View的点击事件时会在View下方弹出(如果下方有空间)
创建步骤:
1、在app/res/menu下新建 Menu Resource File
2、新建PopupMenu对象,并传递上下文对象和弹出菜单绑定的View
3、MenuInflater的inflate()方法可以将Menu Resource File加载到PopupMenu对象.getMenu()里
4、为PopupMenu对象设置setOnMenuItemClickListener()方法
5、在适合的时候显示,设置show()方法
app/res/menu下新建 的option_menu.xml
MainActivity.java
public class MainActivity extendsAppCompatActivity {
@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button mybutton=findViewById(R.id.button);final PopupMenu popupMenu=this.getpopMenu(getApplicationContext(),mybutton);
mybutton.setOnClickListener(newView.OnClickListener() {
@Overridepublic voidonClick(View v) {/*4、在适合的时候显示,设置show()方法*/popupMenu.show();
}
});
}//end_onCreate()
private PopupMenu getpopMenu(finalContext cxt, View v){/*1、新建PopupMenu对象,并传递上下文对象和弹出菜单绑定的View*/PopupMenu menu=newPopupMenu(cxt,v);/*2、MenuInflater的inflate()方法可以将Menu Resource File加载到PopupMenu对象.getMenu()里*/getMenuInflater().inflate(R.menu.popup_menu,menu.getMenu());/*3、为PopupMenu对象设置setOnMenuItemClickListener()方法*/menu.setOnMenuItemClickListener(newPopupMenu.OnMenuItemClickListener() {
@Overridepublic booleanonMenuItemClick(MenuItem item) {switch(item.getItemId()){case R.id.item1:Toast.makeText(cxt,"1",Toast.LENGTH_SHORT).show();case R.id.item2:Toast.makeText(cxt,"2",Toast.LENGTH_SHORT).show();case R.id.item3:Toast.makeText(cxt,"3",Toast.LENGTH_SHORT).show();case R.id.item4:Toast.makeText(cxt,"4",Toast.LENGTH_SHORT).show();
}return true;
}
});returnmenu;
}//end_getpopupMenu()
}
二、上下文菜单:ContextMenu
每一个View都可以绑定一个上下文菜单,通过长按出现我们需要的菜单。
创建方法:
1、在app/res/menu下新建 Menu Resource File
2、Activity.java需要重写onCreateContextMenu()方法,并在该方法中用MenuInflater的inflate将Menu Resource File加载到ContextMenu的对象
3、Activity.java还需要重写onContextItemSelected方法
4、在onCreate()里为需要的View注册上下文菜单:this.registerForContextMenu(View v)
我这里用ListView作为例子,并利用上下文菜单来删除我们选中的ListView的数据项
首先,我们新建一个menu,取名context_menu.xml
在 activity_layout.xml加入ListView
在MainActivity.java为ListView添加数据项,并为ListView注册上下文菜单。使用上下文菜单需要重写onCreateContextMenu和onContextItemSelected这两个方法
/** 上下文菜单+ListView删除item需要满足的条件:
* 1.ListView使用适配器(用到适配器的notifyDataSetChanged())
* 2.是一维ListView(图文混排那种得不到焦点无法触发长按效果,(也有可能是我孤陋寡闻不会设置))
* 3.数据是ArrayList类型(可以remove)
**/
public class MainActivity extendsAppCompatActivity {
ListView mylistView;
Listitems;
ArrayAdaptermyadapter;private intitem_position;
@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);items=new ArrayList<>();//添加数据
items.add("红楼梦");
items.add("西游记");
items.add("水浒传");
items.add("三国演义");
mylistView=findViewById(R.id.listview);
myadapter=new ArrayAdapter(Main2Activity.this,android.R.layout.simple_list_item_1,items);//适配器与数据适配
mylistView.setAdapter(myadapter);//适配器与ListView适配
this.registerForContextMenu(mylistView);//ListView注册上下文菜单
}
@Overridepublic voidonCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {//下面两句必须有
MenuInflater inflater =getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);//下面两句得到item的位置
AdapterView.AdapterContextMenuInfo info =(AdapterView.AdapterContextMenuInfo) menuInfo;
item_position=info.position;
}
@Overridepublic booleanonContextItemSelected(@NonNull MenuItem item) {if(item.getItemId()==R.id.delete_item){//删除数据项,并通知适配器
items.remove(item_position);
myadapter.notifyDataSetChanged();
}return true;
}
}
效果图如下: