【Android 开发】:UI控件之 Menu 菜单的的使用(三)

    上一讲 【Android 开发】:UI控件之 Menu 菜单的的使用(二) 我们讲解了创建上下文菜单的第一种使用方式:Creating a floating context menu [创建悬浮的上下文菜单],这一讲我们来讲解创建上下文菜单的第二种使用方式:Using the contextual action mode [使用上下文动作模式],另外在本章末,我们也来学习一下弹出菜单 PopupMenu 的使用。

1contextual action mode

    1) contextual action mode 介绍

    contextual action mode 是系统继承ActionMode所得,主要是获取用户的焦点来交互相关的动作。当用户选择一个选项就会启动这种模式,一个上下文的 ActionBar 就会出现在屏幕的上方来显示用户执行当前选项所获得上下文菜单。当这个模式启动的时候,用户可以选择多个选项(如果你需要的话),或者反选选项,还可以对齐进行导航(比如条状到其他的Activity),用户可以选择 Back 按钮来取消相关的操作,或者在这个bar栏的左端选择 Done 按钮。
    注意:contextual action mode 与 action bar是没有必然关联的。这个操作是独立的,尽管这个 contextual action mode 看起来覆盖于 action bar 的位置。
  如果你是在 Android 3.0 或者更高版本,你应该使用 contextual action mode 这种方式上下文菜单来代替 floating context menu.
  对于可以提供上下文动作的控件来说,你通常有两种方式的触发事件来调用 contextual action mode:
  1). 用户在这个控件中执行长按事件
  2). 用户在这个视图中选择了 checkbox 或者类似UI的组件
  应用程序在调用contextual action mode或者定义这种触发事件的动作往往依赖于你的设计。基本有以下两种设计
  1). 在独立,专门的控件上使用 contextual action mode。
  2). 在ListView 或者 GridView 上使用contextual action mode (用户可以选择多个选项)
  启动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) 程序执行结果

【Android 开发】:UI控件之 Menu 菜单的的使用(三)_第1张图片

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) 执行结果

【Android 开发】:UI控件之 Menu 菜单的的使用(三)_第2张图片

 
      详情参考:http://developer.android.com/guide/topics/ui/menus.html

你可能感兴趣的:(android,action,菜单,popup,menu,menu,mode)