android 关闭上下文菜单,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

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;

}

}

效果图如下:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值