上下文菜单
天地之功不可仓促,艰难之业当累日月。 --后汉书
当用户长按某个视图或视图元素后出现的浮动菜单,菜单中所包含的动作是与用户所选择视图元素相关的
Android系统中的两种上下文菜单模式
浮动模式
用户在视图元素上执行一个长点击(按住并保持)事件,上下文菜单项浮动列表会弹出,类似对话框,显示在原有视图的上面,覆盖原有的部分用户界面。用户可以每次在浮动菜单中选择一个可执行动作。
动作模式
- 这种模式是ActionMode的系统实现,可以在屏幕顶部显示上下文动作条,其中的菜单项是与所选视图元素相关的动作。用户可以在使用上下文菜单的动作条中选择一个或者多个动作。
- 这种模式只有在Android3.0或者更高版本中可用,是使用上下文菜单的推荐模式。
浮动模式创建步骤
-
创建弹出菜单配置文件XML
<menu 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" tools:context="com.example.contextmenu.MainActivity"> <item android:id="@+id/action_AY" android:orderInCategory="50" android:title="@string/AY" app:showAsAction="ifRoom" /> <item android:id="@+id/action_GZ" android:orderInCategory="100" android:title="@string/GZ" app:showAsAction="ifRoom" /> </menu> -
添加弹出菜单到对应的View控件上
im = findViewById(R.id.image);-
创建上下文菜单
-
覆盖Activity的onCreateContextMenu()方法
@Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { getMenuInflater().inflate(R.menu.menu_main,menu); super.onCreateContextMenu(menu, v, menuInfo); } -
调用Menu的add()方法添加菜单项(Menulitem)
menu.add(0,3,0,"玩耍"); /* * 第一个int类型的group ID参数,代表的是组概念,你可以将几个菜单项归为一组,以便更好的以组的方式管理你的菜单选项 * 第二个int类型的Item ID参数,代表的是项目编号。这个参数非常重要 * 第三个int类型的order ID参数,代表的是菜单项的显示顺序。默认0 * 第三个String类型的title参数,表示的是选项中的显示文字 * */
-
-
调用registerForContextMenu()方法为视图注册上下文菜单
registerForContextMenu(im);
-
-
定义菜单事件响应
-
覆盖Activity的onContextItemSelected()来响应事件
@SuppressLint("NonConstantResourceId") @Override public boolean onContextItemSelected(@NonNull MenuItem item) { switch (item.getItemId()){ case R.id.action_AY: im.setImageResource(R.drawable.png1); Toast.makeText(this,"疯狂熬夜中。。。。",Toast.LENGTH_SHORT).show(); break; case R.id.action_GZ: im.setImageResource(R.drawable.png2); Toast.makeText(this,"疯狂工作中。。。。",Toast.LENGTH_SHORT).show(); break; case 3: im.setImageResource(R.drawable.png0); Toast.makeText(this,"疯狂玩耍中。。。。",Toast.LENGTH_SHORT).show(); break; } return super.onContextItemSelected(item); }
-
整个java源码
public class MainActivity extends AppCompatActivity {
ImageView im;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
/*需要绑定的控件*/
im = findViewById(R.id.image);
/*注册上下文菜单到控件上*/
registerForContextMenu(im);
}
/*创建上下文菜单*/
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
getMenuInflater().inflate(R.menu.menu_main,menu);
menu.add(0,3,0,"玩耍");
/*
* 第一个int类型的group ID参数,代表的是组概念,你可以将几个菜单项归为一组,以便更好的以组的方式管理你的菜单选项
* 第二个int类型的Item ID参数,代表的是项目编号。这个参数非常重要
* 第三个int类型的order ID参数,代表的是菜单项的显示顺序。默认0
* 第三个String类型的title参数,表示的是选项中的显示文字
* */
super.onCreateContextMenu(menu, v, menuInfo);
}
/*上下文菜单点击事件*/
@SuppressLint("NonConstantResourceId")
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.action_AY:
im.setImageResource(R.drawable.png1);
Toast.makeText(this,"疯狂熬夜中。。。。",Toast.LENGTH_SHORT).show();
break;
case R.id.action_GZ:
im.setImageResource(R.drawable.png2);
Toast.makeText(this,"疯狂工作中。。。。",Toast.LENGTH_SHORT).show();
break;
case 3:
im.setImageResource(R.drawable.png0);
Toast.makeText(this,"疯狂玩耍中。。。。",Toast.LENGTH_SHORT).show();
break;
}
return super.onContextItemSelected(item);
}
}
actionMode创建步骤(动作模式)
-
创建弹出菜单配置文件XML
<menu 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" tools:context="com.example.contextmenu.MainActivity"> <item android:id="@+id/action_AY" android:orderInCategory="50" android:title="@string/AY" android:icon="@drawable/png1" app:showAsAction="ifRoom" /> <item android:id="@+id/action_GZ" android:orderInCategory="100" android:title="@string/GZ" android:icon="@drawable/png2" app:showAsAction="ifRoom" /> </menu> -
添加弹出菜单到对应的View控件上
findViewById(R.id.image2)-
创建ActionMode
private android.view.ActionMode actionMode;
private ActionMode actionMode; -
实现Action Mode的callback接口
final ActionMode.Callback callback = new ActionMode.Callback() { @Override public boolean onCreateActionMode(ActionMode actionMode, Menu menu) { actionMode.getMenuInflater().inflate(R.menu.menu_main,menu); return true; //返回值为true } @Override public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) { return false; } @Override public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) { switch (menuItem.getItemId()){ case R.id.action_AY: im.setImageResource(R.drawable.png1); Toast.makeText(ContextMenu2.this,"疯狂熬夜中。。。。",Toast.LENGTH_SHORT).show(); break; case R.id.action_GZ: im.setImageResource(R.drawable.png2); Toast.makeText(ContextMenu2.this,"疯狂工作中。。。。",Toast.LENGTH_SHORT).show(); break; } return true; } @Override public void onDestroyActionMode(ActionMode actionMode) { } }; -
调用setOnlongClickListener()方法为视图注册上下文菜单
findViewById(R.id.image2).setOnLongClickListener();
-
-
定义菜单响应事件
-
设置控件的OnLongClickListener()来响应事件
findViewById(R.id.image2).setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { if(actionMode != null){ return false; } actionMode = startActionMode(callback); view.setSelected(true); return true; } });
-
整个java源码
public class ContextMenu2 extends AppCompatActivity {
private ActionMode actionMode;
ImageView im;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityContextMenu2Binding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
im =findViewById(R.id.image2);
final ActionMode.Callback callback = new ActionMode.Callback() {
@Override
public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
actionMode.getMenuInflater().inflate(R.menu.menu_main,menu);
return true; //返回值为true
}
@Override
public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
switch (menuItem.getItemId()){
case R.id.action_AY:
im.setImageResource(R.drawable.png1);
Toast.makeText(ContextMenu2.this,"疯狂熬夜中。。。。",Toast.LENGTH_SHORT).show();
break;
case R.id.action_GZ:
im.setImageResource(R.drawable.png2);
Toast.makeText(ContextMenu2.this,"疯狂工作中。。。。",Toast.LENGTH_SHORT).show();
break;
}
return true;
}
@Override
public void onDestroyActionMode(ActionMode actionMode) {
}
};
findViewById(R.id.image2).setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
if(actionMode != null){
return false;
}
actionMode = startActionMode(callback);
view.setSelected(true);
return true;
}
});
}
}
本文详细介绍了Android系统中的两种上下文菜单模式:浮动模式和动作模式。浮动模式在用户长按视图元素后弹出,覆盖部分用户界面;动作模式则在屏幕顶部显示上下文动作条,适用于Android3.0及以上版本,是推荐的使用方式。文章通过实例代码演示了如何创建这两种上下文菜单。
2071

被折叠的 条评论
为什么被折叠?



