Android:弹出式菜单、上下文菜单
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
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <item android:id="@+id/item1" android:title="1" /> <item android:id="@+id/item2" android:title="2" /> <item android:id="@+id/item3" android:title="3" /> <item android:id="@+id/item4" android:title="4" /> <item android:id="@+id/item5" android:title="5" /> </menu>
MainActivity.java
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(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(new View.OnClickListener() { @Override public void onClick(View v) { /*4、在适合的时候显示,设置show()方法*/ popupMenu.show(); } }); }//end_onCreate() private PopupMenu getpopMenu(final Context cxt, View v){ /*1、新建PopupMenu对象,并传递上下文对象和弹出菜单绑定的View*/ PopupMenu menu=new PopupMenu(cxt,v); /*2、MenuInflater的inflate()方法可以将Menu Resource File加载到PopupMenu对象.getMenu()里*/ getMenuInflater().inflate(R.menu.popup_menu,menu.getMenu()); /*3、为PopupMenu对象设置setOnMenuItemClickListener()方法*/ menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(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; } }); return menu; }//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
<?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/delete_item" android:title="删除"/> </menu>
在 activity_layout.xml 加入ListView
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".Main2Activity"> <ListView android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
在MainActivity.java为ListView添加数据项,并为ListView注册上下文菜单。使用上下文菜单需要重写onCreateContextMenu和onContextItemSelected这两个方法
/* * 上下文菜单+ListView删除item需要满足的条件: * 1.ListView使用适配器(用到适配器的notifyDataSetChanged()) * 2.是一维ListView(图文混排那种得不到焦点无法触发长按效果,(也有可能是我孤陋寡闻不会设置)) * 3.数据是ArrayList类型(可以remove) * */ public class MainActivity extends AppCompatActivity { ListView mylistView; List<String> items; ArrayAdapter<String> myadapter; private int item_position; @Override protected void onCreate(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<String>(Main2Activity.this,android.R.layout.simple_list_item_1,items);//适配器与数据适配 mylistView.setAdapter(myadapter);//适配器与ListView适配 this.registerForContextMenu(mylistView);//ListView注册上下文菜单 }
@Override public void onCreateContextMenu(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; } @Override public boolean onContextItemSelected(@NonNull MenuItem item) { if(item.getItemId()==R.id.delete_item){ //删除数据项,并通知适配器 items.remove(item_position); myadapter.notifyDataSetChanged(); } return true; } }
效果图如下:


浙公网安备 33010602011771号