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注册上下文菜单。使用上下文菜单需要重写onCreateContextMenuonContextItemSelected这两个方法

/*
* 上下文菜单+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; } }

 

效果图如下:

  

posted @ 2020-06-06 15:38  ECHO_01  阅读(915)  评论(0)    收藏  举报