zoukankan      html  css  js  c++  java
  • Android 上下文菜单(Context Menu)

    一、概述

      Android中,上下文菜单是通过onLongClick(...)事件访问的。在事件触发后显示菜单项。

      在使用上下文菜单时,通常在onCreate(...)方法中,先行注册上下文菜单。在实现onCreateContextMenu(...)方法和onContextItemSelected(...)方法。

      注册菜单方法:registerForContextMenu(...)

      注销注册菜单方法:unregisterForContextMenu(...)

    二、使用XML文件添加上下文菜单

      text_menu.xml上下文菜单选项:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <menu xmlns:android="http://schemas.android.com/apk/res/android">
     3     <item android:title="File">
     4         <menu>
     5             <group android:checkableBehavior="none">
     6                 <item android:id="@+id/file_new"
     7                       android:title="New"
     8                       android:icon="@android:drawable/ic_input_add"
     9                       android:alphabeticShortcut="n" />
    10                 <item android:id="@+id/file_save"
    11                       android:title="Save"
    12                       android:icon="@android:drawable/ic_menu_save"
    13                       android:alphabeticShortcut="s" />
    14             </group>
    15         </menu>
    16     </item>
    17     <item android:title="Edit">
    18         <menu>
    19             <!-- 单选按钮组 -->
    20             <group android:checkableBehavior="single">
    21                 <item android:id="@+id/cut"
    22                       android:title="Cut"
    23                       android:alphabeticShortcut="Ctrl + x" />
    24                 <item android:id="@+id/copy"
    25                       android:title="Copy"
    26                       android:alphabeticShortcut="Ctrl + c" />
    27                 <item android:id="@+id/paste"
    28                       android:title="Paste"
    29                       android:alphabeticShortcut="Ctrl + v" />
    30             </group>
    31         </menu>
    32     </item>
    33 </menu>

      在代码中,添加上下文菜单显示,及在选择上下文菜单项时触发事件(MainActivity.java):

     1 public class MainActivity extends Activity
     2 {
     3     private static final String TAG = "MainActivity";
     4     private Context mContext;
     5     private EditText mEditMenu;
     6     private MenuInflater mMenuInflater;
     7 
     8     @Override
     9     public void onCreate(Bundle savedInstanceState)
    10     {
    11         super.onCreate(savedInstanceState);
    12         setContentView(R.layout.activity_main);
    13 
    14         mContext = getApplicationContext();
    15 
    16         // 绑定菜单按钮事件
    17         mEditMenu = (EditText) findViewById(R.id.input_text3);
    18         // 注册上下文菜单
    19         registerForContextMenu(mEditMenu);
    20     }
    21 
    22     // 上下文菜单,与EditView控件绑定,长按显示菜单项
    23     @Override
    24     public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo contextMenuInfo)
    25     {
    26         super.onCreateContextMenu(menu, view, contextMenuInfo);
    27         // 创建新的contextMenu对象
    28         mMenuInflater = new MenuInflater(this);
    29         // 使用XML与原menu对象对新ContextMenu对象初始化
    30         mMenuInflater.inflate(R.menu.text_menu, menu);
    31     }
    32 
    33     // 上下文菜单,触发上下文菜单项点击事件时响应
    34     @Override
    35     public boolean onContextItemSelected(MenuItem item)
    36     {
    37         switch (item.getItemId())
    38         {
    39             case R.id.file_new:
    40             {
    41                 Toast.makeText(mContext, "File new.", Toast.LENGTH_SHORT).show();
    42                 break;
    43             }
    44             case R.id.file_save:
    45             {
    46                 Toast.makeText(mContext, "File save.", Toast.LENGTH_SHORT).show();
    47                 break;
    48             }
    49             case R.id.cut:
    50             {
    51                 Toast.makeText(mContext, "Edit cut.", Toast.LENGTH_SHORT).show();
    52                 break;
    53             }
    54             case R.id.copy:
    55             {
    56                 Toast.makeText(mContext, "Edit copy.", Toast.LENGTH_SHORT).show();
    57                 break;
    58             }
    59             case R.id.paste:
    60             {
    61                 Toast.makeText(mContext, "Edit paste.", Toast.LENGTH_SHORT).show();
    62                 break;
    63             }
    64             default:
    65                 Toast.makeText(mContext, "无响应", Toast.LENGTH_SHORT).show();
    66         }
    67         return true;
    68     }
    69 
    70     // 注销注册过的上下文菜单
    71     @Override
    72     public void onDestroy()
    73     {
    74         super.onDestroy();
    75         unregisterForContextMenu(mEditMenu);
    76     }
    77 }

      PS:ContextMenu的任何项在被选中后,整个ContextMenu会自动被系统关闭掉,即使多选项也是这样。这样的话,多选项的行为就有些怪异。查看Android的源码后,发现这是个Android的bug,应该是google没考虑多选项的情况。

      尽管上下文菜单的拥有者是View,生成上下文菜单却是通过Activity中的onCreateContextMenu ( ContextMenu  menu,  View  v,ContextMenu.ContextMenuInfo  menuInfo)方法,该方法很像生成Options Menu的onCreateOptionsMenu ( Menu  menu)方法。两者的不同在于,onCreateOptionsMenu 只在用户 第一次 按“Menu”键时被调用,而onCreateContextMenu 会在用户 每一次 长按View时被调用,而且View必须已经注册了上下文菜单。

  • 相关阅读:
    re.match() and re.search()
    libxml2 使用教程【转】
    Spring PropertyPlaceholderConfigurer类载入外部配置
    Spring PropertyPlaceholderConfigurer类载入外部配置
    Spring PropertyPlaceholderConfigurer类载入外部配置
    Spring PropertyPlaceholderConfigurer类载入外部配置
    前缀和、前缀积
    前缀和、前缀积
    前缀和、前缀积
    前缀和、前缀积
  • 原文地址:https://www.cnblogs.com/naray/p/5358438.html
Copyright © 2011-2022 走看看