main2.xml--
- "@+id/action2_settings"
android:icon="@drawable/menu_icon_query"
android:title="@string/action_settings">
</item>
- "
android:icon="
@drawable/menu_icon_history"
android:title="@string/action_second"/>
- @+
id/action2_third"
android:icon="@drawable/menu_icon_submit"
android:title="@string/action_third"/>
- @+
id/action2_forth"
android:icon="@drawable/menu_icon_update"
android:title="@string/action_forth"/>
//菜单构建
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main2, menu);
}
text = (TextView) findViewById(R.id.textClick)
text.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG)
registerForContextMenu(text)
这时候再进去,发现还是没有菜单,别急,你需要长按text控件就可以看到的菜单了。
@Override
public boolean onContextItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action2_settings:
Toast.makeText(MainActivity.this, "这是第一个菜单。", Toast.LENGTH_SHORT)
.show()
return true
case R.id.action2_second:
Toast.makeText(MainActivity.this, "这是第二个菜单。", Toast.LENGTH_SHORT)
.show()
return true
case R.id.action2_third:
Toast.makeText(MainActivity.this, "这是第三个菜单。", Toast.LENGTH_SHORT)
.show()
return true
case R.id.action2_forth:
Toast.makeText(MainActivity.this, "这是第四个菜单。", Toast.LENGTH_SHORT)
.show()
return true
default:
return super.onContextItemSelected(item)
}
}
在里面的toast可以换成你需要的操作。
还有一种其他模式,叫contextual action mode,中文也不知道是什么意思,反正就是另外一种模式的唤出方式。这种模式经常在打开手机文件的时候,长按列表的时候会弹出的一个修改了actionbar的展示方式的界面,以前我还以为是在长按的时候触发监听,切换了布局,没想到有这么简单的实现方式。
代码实现方式:
/***
* 这个继承 mode action , 完成menu界面的绘制,以及前后的一些处理
*/
private ActionMode.Callback mActionModeCallBack = new ActionMode.Callback() {
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
mActionMode = null;
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.main2, menu);
return true;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
return false;
}
};
/**
*这个则类似对view对象进行注册,唤出界面。,
*/
text = (TextView) findViewById(R.id.textClick);
text.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);
text.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (mActionMode != null) {
return false;
}
mActionMode = startActionMode(mActionModeCallBack);
v.setSelected(true);
return true;
}
});
这两个就是长按前和长按的对比,这样看也许还不是很明显之间的区别,他们之间的区别在于可以批量的操作,加上ListView之后,你应该就会很清楚他们之间的区别了。接下来就把这个应用到ListView上。
看到这幅图,大家大概都知道这个的用处了吧。这个可以长期停留在这个界面,并且可以进行多次菜单点击操作以及批量的操作。
list = (ListView) findViewById(R.id.list);
list.setAdapter(new MyAdapter(this));
list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
list.setMultiChoiceModeListener(new MultiChoiceModeListener() {
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.main2, menu);
return true;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch (item.getItemId()) {
case R.id.action2_settings:
Toast.makeText(MainActivity.this, "这是第一个菜单。",
Toast.LENGTH_SHORT).show();
return true;
case R.id.action2_second:
Toast.makeText(MainActivity.this, "这是第二个菜单。",
Toast.LENGTH_SHORT).show();
return true;
case R.id.action2_third:
Toast.makeText(MainActivity.this, "这是第三个菜单。",
Toast.LENGTH_SHORT).show();
return true;
case R.id.action2_forth:
Toast.makeText(MainActivity.this, "这是第四个菜单。",
Toast.LENGTH_SHORT).show();
return true;
default:
return false;
}
}
@Override
public void onItemCheckedStateChanged(ActionMode mode,
int position, long id, boolean checked) {
}
});
这是一种类似spinner的弹出框菜单,在你点点击了某个view之后,就会跟spinner一样下拉式的弹出菜单列表。这种菜单通过代码来创建实例,然后利用这个实例来把xml文件构建成菜单项。实例则是通过传入上下文和唤出这个菜单的view来构造实例。
popupMenu = new PopupMenu(this, text);
popupMenu.inflate(R.menu.main2);
text.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
popupMenu.show();
}
});
点击text就可以显示出这个菜单了,如下图。
对于事件的点击监听也是跟之前类似的回调方法实现。图方便就直接toast,完全可以跟前面一样的switch来实现点击事件的处理。
popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
Toast.makeText(MainActivity.this, item.getTitle().toString(),
Toast.LENGTH_SHORT).show();
return true;
}
});