1. contextual action mode
1). 用户在这个控件中执行长按事件2). 用户在这个视图中选择了 checkbox 或者类似UI的组件
1). 在独立,专门的控件上使用 contextual action mode。2). 在ListView 或者 GridView 上使用contextual action mode (用户可以选择多个选项)
如果想要调用 contextual action mode 当你选择了指定的控件之后,你应该:1). 实现 ActionMode.Callback 接口,在它的回调接口中,你可以指定 这个上下文栏的动作,触发选项事件的反应,或者处理其他事件周期.2). 调用 startActionMode() 当你想要显示这个条栏的话(相当于当用户长按这个视图)
2) 代码实现
1) 布局文件 activity_main.xml 只是定义一个按钮,这里就不再粘贴了。
2) 菜单定义文件 目录:res/menu 下 main.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/share" android:orderInCategory="100" android:showAsAction="never" android:title="Share"/> <item android:id="@+id/edit" android:orderInCategory="100" android:showAsAction="never" android:title="Edit"/> <item android:id="@+id/delete" android:orderInCategory="100" android:showAsAction="never" android:title="Delete"/> </menu>3). 程序主要代码
public class MainActivity extends Activity { private Button button1; private ActionMode actionMode; //使用 ActionMode 完成菜单操作 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initComponent(); //绑定用户的动作,注意这个事件必须是一个长按事件 button1.setOnLongClickListener(new OnLongClickListener() { /* * 当你调用startActionMode()方法的时候,系统就会返回一个ActionMode的实例,保存在成员变量中,就可以通过改变上下文条栏来触发对应的事件 * 在下面的的例子中,ActionMode的判断是为了确保在它活动期间不会被重复的再创建,通过在创建实例的时候判断其是否为空。 * @see android.view.View.OnLongClickListener#onLongClick(android.view.View) */ @Override public boolean onLongClick(View v) { if(actionMode != null) { return false; } actionMode = startActionMode(mActionModeCallBack); v.setSelected(true); return true; } }); } //这里面是一个匿名内部类 private ActionMode.Callback mActionModeCallBack = new ActionMode.Callback() { @Override public boolean onPrepareActionMode(ActionMode mode, Menu menu) { // TODO Auto-generated method stub return false; } @Override public void onDestroyActionMode(ActionMode mode) { // TODO Auto-generated method stub //当我们不在使用菜单的时候, actionMode = null 在菜单销毁的时候置空 actionMode = null; } //表示我们要加载菜单,从XML中加载菜单 @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { // TODO Auto-generated method stub MenuInflater inflate = getMenuInflater(); inflate.inflate(R.menu.main, menu); return true; //返回true 表示加载成功。 } //处理用户的相应动作 //表示从点击菜单选项中捕获用户的操作 @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { // TODO Auto-generated method stub switch (item.getItemId()) { case R.id.edit: Toast.makeText(MainActivity.this, "Edit", 3).show(); break; case R.id.share: Toast.makeText(MainActivity.this, "share", 3).show(); break; case R.id.delete: Toast.makeText(MainActivity.this, "delete", 3).show(); break; } return false; } }; @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } private void initComponent(){ button1 = (Button)findViewById(R.id.button1); } }3) 程序执行结果
![]()
2. PopupMenu 菜单的使用
1) PopupMenu 介绍
创建弹出菜单,它一般会在view的上边或者下边弹出菜单[具体看是否有空间],注意弹出菜单是api在11或者更高版本中使用如果你在XML文件中定义了你的菜单,你就可以通过以下步骤来显示弹出菜单了:1. 实例化一个 PopupMenu 通过它的构造方法,这样就可以把当前应用的 context 和 view 传给所定义的菜单了2. 使用 MenuInflater 来加载菜单资源,通过 PopupMenu.getMenu() 得到一个 Menu 对象,如果是在 API 14 或者更高级,你可以通过 PopupMenu.inflate() 来代替了。3. 调用 PopupMenu.show()。
2) 程序实现
1) 布局文件 activity_main.xml 只是定义一个按钮,这里就不再粘贴了。
2) 菜单定义文件 目录:res/menu 下 main.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" > <item android:id="@+id/share" android:orderInCategory="100" android:showAsAction="never" android:title="Share"/> <item android:id="@+id/edit" android:orderInCategory="100" android:showAsAction="never" android:title="Edit"/> <item android:id="@+id/delete" android:orderInCategory="100" android:showAsAction="never" android:title="Delete"/> </menu>3) 程序主要代码
public class MainActivity extends Activity { private Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initComponent(); //这种就不需要长按事件 button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub //当前这个v就是 button2控件 PopupMenu popupMenu = new PopupMenu(MainActivity.this, v); popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { // TODO Auto-generated method stub switch (item.getItemId()) { case R.id.edit: Toast.makeText(MainActivity.this, "Edit", 3).show(); break; case R.id.share: Toast.makeText(MainActivity.this, "share", 3).show(); break; case R.id.delete: Toast.makeText(MainActivity.this, "delete", 3).show(); break; } return false; } }); MenuInflater inflater = popupMenu.getMenuInflater(); inflater.inflate(R.menu.main, popupMenu.getMenu()); popupMenu.show(); } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } private void initComponent(){ button = (Button)findViewById(R.id.button1); } }3) 执行结果