zoukankan      html  css  js  c++  java
  • android上下文菜单(ContextMenu)

    概述:

    Android 的上下文菜单类似于 PC 上的右键菜单。当为一个视图注册了上下文菜单之后,长按(2 秒左右)这个视图对象就会弹出一个浮动菜单,即上下文菜单。任何视图都可以注册上下文菜单,不过,最常见的是用于列表视图ListView的item。

    注意:Android 的上下文菜单不支持图标或快捷键。

    创建一个上下文菜单的步骤:

    1. 覆盖 Activity 的 onCreateContenxtMenu() 方法,调用 Menu 的 add 方法添加菜单项(MenuItem)。

    2. 覆盖 Activity 的 onContextItemSelected() 方法,响应上下文菜单菜单项的单击事件。

    3. 调用 registerForContextMenu() 方法,为视图注册上下文菜单。

    示例:

    MainActivity.java 文件:

    //file name: MainActivity.java

    package hi.braincol.local.contextMenu;

    import android.app.ListActivity;

    import android.os.Bundle;

    import android.view.ContextMenu;

    import android.view.Menu;

    import android.view.MenuItem;

    import android.view.ContextMenu.ContextMenuInfo;

    import android.view.View;

    import android.widget.AdapterView.AdapterContextMenuInfo;

    import android.widget.ArrayAdapter;

    import android.util.Log;

    public class MainActivity extends ListActivity {

        

        private static final int ITEM1 = Menu.FIRST;

        private static final int ITEM2 = Menu.FIRST+1;

        private static final int ITEM3 = Menu.FIRST+2;

        

        /** Called when the activity is first created. */

        @Override

        public void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);   

            showListView();

            

            //为 ListView 的所有 item 注册 ContextMenu

            registerForContextMenu(getListView());

            //这里的registerForContextMenu()也可以用下面的语句替代

            //getListView().setOnCreateContextMenuListener(this);

        }

        

        private void showListView(){

            String[] mString = new String[]{

                    "路飞-Monkey D Luffy", 

                    "奈美-Nami", 

                    "卓洛-Zoro",

                    "山治-Sanji", 

                    "尼可·罗宾-Ms. All Sunday", 

                    "乌索普-usoppu", 

                    "托尼托尼·乔巴-Tony Tony Chopper",

            };

            ArrayAdapter<String> mla = new ArrayAdapter<String>(MainActivity.this, 

                    R.layout.main, mString);

            MainActivity.this.setListAdapter(mla);      

        }

        

        //上下文菜单,本例会通过长按条目激活上下文菜单

        @Override

        public void onCreateContextMenu(ContextMenu menu, View view, 

                ContextMenuInfo menuInfo) {

            menu.setHeaderTitle("人物简介");

            //添加菜单项

            menu.add(0, ITEM1, 0, "特长");

            menu.add(0, ITEM2, 0, "战斗力");

            menu.add(0, ITEM3, 0, "经典语录");

        }

        

        //菜单单击响应

        @Override

        public boolean onContextItemSelected(MenuItem item){

            //获取当前被选择的菜单项的信息

            //AdapterContextMenuInfo info = (AdapterContextMenuInfo)item.getMenuInfo();

            //Log.i("braincol",String.valueOf(info.id));        

            switch(item.getItemId()){

            case ITEM1:

                //在这里添加处理代码

                

                break;

            case ITEM2:

                //在这里添加处理代码

                

                break;    

            case ITEM3:

                //在这里添加处理代码

                

                break;

            }

            return true;

        }

        

    }

    main.xml 布局文件:

    <?xml version="1.0" encoding="utf-8"?>

    <TextView xmlns:android="http://schemas.android.com/apk/res/android"

        android:id="@+id/myTextView"

        android:textSize="20sp"

        android:layout_width="fill_parent"

        android:layout_height="fill_parent"

        android:text="@string/hello"

        />

    运行结果:

    ContextMenu  menu

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    ****************************************************************************************************************

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    • 上下文菜单Context Menu   
    •   
    • Android的上下文菜单在概念上和PC软件的右键菜单类似。当一个视图注册到一个上下文菜单时,执行一个在该对象上的“长按”(按住不动差不多两秒钟)动作,将出现一个提供相关功能的浮动菜单。上下文菜单可以被注册到任何视图对象中,不过,最常见的是用于列表视图ListView的item,在按中列表项时,会转换其背景色而提示将呈现上下文菜单。 (电话联系人列表提供了关于这个特性的一个很好的例子)。   
    •   
    • 注意:上下文菜单项不支持图标或快捷键。   
    •   
    • 为了创建一个上下文菜单,你必须重写这个活动的上下文菜单回调函数:onCreateContextMenu() 和onContextItemSelected()。在回调函数onCreateContextMenu()里,你可以通过使用一个add()方法来添加菜单项,或者通过扩充一个定义在XML中的菜单资源。然后,通过registerForContextMenu()为这个视图注册一个上下文菜单ContextMenu.   
    •   
    • 比如,下面的代码可以被用到Notepad应用程序中来为列表中的每一个注释添加一个上下文菜单:   
    •   
    • public void onCreateContextMenu(ContextMenu menu, View v,   
    •                                 ContextMenuInfo menuInfo) {   
    •   super.onCreateContextMenu(menu, v, menuInfo);   
    •   menu.add(0, EDIT_ID, 0"Edit");   
    •   menu.add(0, DELETE_ID, 0,  "Delete");   
    • }   
    •     
    • public boolean onContextItemSelected(MenuItem item) {   
    •   AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();   
    •   switch (item.getItemId()) {   
    •   case EDIT_ID:   
    •     editNote(info.id);   
    •     return true;   
    •   case DELETE_ID:   
    •     deleteNote(info.id);   
    •     return true;   
    •   default:   
    •     return super.onContextItemSelected(item);   
    •   }   
    • }   
    •   
    • 在onCreateContextMenu()中,除了给出将添加MenuItems的ContextMenu外,还需要给定选中的视图和一个上下文菜单信息ContextMenuInfo对象,该对象提供了选中对象的附加信息。在本例中,onCreateContextMenu()没做什么特别的事-只是添加了一些菜单项。在onContextItemSelected() 回调函数中,我们从MenuItem中请求AdapterContextMenuInfo,该对象提供当前选中项的信息。我们从中所要的只是这个选中项的列表ID,所以无论编辑还是删除一个注释,我们通过这个对象的AdapterContextMenuInfo.info字段来找到该ID。这个ID被传递给editNote() 和deleteNote()方法来执行相应的动作。   
    •   
    • 现在,要为一个列表视图中的所有项注册上下文菜单,我们可以传递整个的列表视图对象给registerForContextMenu(View) 方法:   
    •   
    • registerForContextMenu(getListView());   
    •   
    • 记住,你可以传递任何视图对象来注册一个上下文菜单。这里,getListView()返回这个被用于Notepad应用程序的列表活动ListActivity中的列表视图对象。这样,这个列表中的任何item都被注册到这个上下文菜单。   
  • 相关阅读:
    Java实现 LeetCode 30 串联所有单词的子串
    Java实现 LeetCode 29 两数相除
    Java实现 LeetCode 29 两数相除
    Java实现 LeetCode 29 两数相除
    Java实现 LeetCode 28 实现strStr()
    Java实现 LeetCode 28 实现strStr()
    Java实现 LeetCode 28 实现strStr()
    Java实现 LeetCode 27 移除元素
    Java实现 LeetCode 27 移除元素
    字符编码终极笔记:ASCII、Unicode、UTF-8、UTF-16、UCS、BOM、Endian
  • 原文地址:https://www.cnblogs.com/qingblog/p/2507882.html
Copyright © 2011-2022 走看看