popupWindow和contextMenu都是一种弹窗。我们了解一下即可
popup直接new即可:
xml配置如下:
然后设置他的样式,主要是设置他的contentView。既是他的内容view
我这里设置了day7中的listview
然后想day7那样为listview设置数据,这里注意取得是popup里面的contentView,而不是day10activity的this。
//把day7中listview抄过来
// ListView listView = findViewById(R.id.listView);
ListView listView =window.getContentView().findViewById(R.id.listView);
//数据源
String[] objects =new String[]{"这是第一条", "这是第二条"};
ArrayAdapter<String> arrayAdapter=new ArrayAdapter<String>(this,
R.layout.activity_day7_arrayadapter_item,R.id.textView,objects);
listView.setAdapter(arrayAdapter);
然后弹出的时候。有个showAtLocation,设置弹出位置。我这里选择了基于activity的整个布局的底部弹出。
我这里是从底部弹出如下。
contentMenu,一开始我也想new的,解决new出来是他的接口类,并且还没有实现子类
查了一下发现他是已经藏在我们activity中了,需要先注册然后重新相应方法既可以使用
1.在activity的onCreate(...)方法中为一个view注册上下文菜单
2.在onCreateContextMenuInfo(...)中生成上下文菜单。
3.在onContextItemSelected(...)中响应上下文菜单项。
生成和响应如下、
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo) {
// set context menu title
menu.setHeaderTitle("条目");
// add context menu item
menu.add(0, 1, Menu.NONE, "按钮中的弹窗1");
menu.add(0, 2, Menu.NONE, "按钮中的弹窗2");
}
@Override
public boolean onContextItemSelected(MenuItem item) {
// 得到当前被选中的item信息
AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
switch(item.getItemId()) {
case 1:
// do something
break;
case 2:
// do something
break;
default:
return super.onContextItemSelected(item);
}
return true;
}
然后注册的时候绑定一个view,然后长按view就可以触发contentMenu了。
this.registerForContextMenu(findViewById(R.id.contentMenu));
我上面那个给button设置点击事件来触发其实是不对的。
如下