zoukankan      html  css  js  c++  java
  • Android4.0 -- 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) 程序执行结果

  • 相关阅读:
    通用权限管理设计 之 数据库结构设计
    jQuery LigerUI 插件介绍及使用之ligerDateEditor
    jQuery LigerUI 插件介绍及使用之ligerTree
    jQuery LigerUI V1.01(包括API和全部源码) 发布
    jQuery liger ui ligerGrid 打造通用的分页排序查询表格(提供下载)
    jQuery LigerUI V1.1.5 (包括API和全部源码) 发布
    jQuery LigerUI 使用教程表格篇(1)
    jQuery LigerUI V1.0(包括API和全部源码) 发布
    jQuery LigerUI V1.1.0 (包括API和全部源码) 发布
    nginx keepalived
  • 原文地址:https://www.cnblogs.com/sishuiliuyun/p/3276651.html
Copyright © 2011-2022 走看看