• 系统组件:菜单Menu(1)


      常用的菜单有:

        OptionMenu(系统菜单):当点击手机的菜单键时,出现在应用顶部下的菜单。

        ContextMenu(上下文菜单):当长按某一UI控件时,出现的菜单。

        PopupMenu(弹出菜单):当点击某一UI控件时,弹出的菜单。

        SubMenu(子菜单):当点击某一菜单的菜单项时,出现的下一级菜单。

        

        下面主要总结前三种菜单的用法:

        1.OptionMenu使用:重写Activity的回调方法onCreateOptionsMenu()创建选项菜单,同时一般肯定会对菜单项进行监听,所以同时会重写onOptionsItemSelected()。菜单项可以在menu文件夹下定义xml菜单项文件。

      eg:

    1 // 创建系统菜单
    2     @Override
    3     public boolean onCreateOptionsMenu(Menu menu) {
    4         // 将Menu文件转化为菜单的菜单项
    5         getMenuInflater().inflate(R.menu.main, menu);
    6         return true;
    7     }

    getMenuInflater()获得一个MenuInflater对象,和getLayoutInflater()方法类似,都是获取一个Inflater对象,其中getMenuInflater().inflater()是将菜单项布局文件转换为视图对象进而绑定在系统菜单上,而getLayoutInflater().inflater()则是将指定布局xml文件转化为View对象。进一步扩展,在非Activity中获取LayoutInflater对象,可以通过LayoutInflater.from(context)得到,但是没有MenuInflater.from(context)方法。

    1 // 设置点击系统菜单项的监听事件
    2     @Override
    3     public boolean onOptionsItemSelected(MenuItem item) {
    4         Toast.makeText(this, "点击了" + item.getTitle(), Toast.LENGTH_SHORT)
    5                 .show();
    6         return super.onOptionsItemSelected(item);
    7     }

    new MenuItem().getTitle()是一个比较有用的方法,菜单项的定义一般是用xml文件定义的,那么怎么获取xml文件中菜单项显示的文本呢?通过MunuItem的getTitle()这个方法可以获取xml文件中定义的菜单项文本,也就是获取了界面上出现的菜单项中文本。

    点击菜单键出现的系统菜单效果图:

        2.ContextMenu使用:第一步需要为需要添加上下文菜单的控件注册,通过调用registerForContextMenu(view)来完成注册,第二步是通过重写onCreateContextMenu()方法创建上下文菜单,第三部也就是为上下文菜单中的菜单项添加监听事件,重写onContextItemSelected完成事件监听。可以看到后两步的操作和OptionMenu思路类似,唯一不同的是ContextMenu必须要注册才能使用。

    eg:

    1 // 为listView注册上下文菜单
    2         registerForContextMenu(listView);
    1 // 创建上下文菜单
    2     @Override
    3     public void onCreateContextMenu(ContextMenu menu, View v,
    4             ContextMenuInfo menuInfo) {
    5         // 将Menu文件转化为菜单的菜单项
    6         getMenuInflater().inflate(R.menu.context_menu, menu);
    7         super.onCreateContextMenu(menu, v, menuInfo);
    8     }
    1 // 设置点击上下文菜单项的监听事件
    2     @Override
    3     public boolean onContextItemSelected(MenuItem item) {
    4         Toast.makeText(this, "点击了" + item.getTitle(), Toast.LENGTH_SHORT)
    5                 .show();
    6         return super.onContextItemSelected(item);
    7     }

    ContextMenu使用的后两个方法结构和OptionMenu使用的方法完全相同。

    长按ListView中的任意一项数据项出现的ContextMenu效果图:

        3.PopupMenu的使用:首先为某个控件添加点击事件,然后在调用的点击事件中创建PopupMenu对象,为PopupMenu对象设置菜单项,为PopupMenu设置监听事件,最后将PopupMenu显示出来。

     1 // 点击按钮时,出现弹出菜单
     2     public void popupMenu(View view) {
     3         // 第二个参数是设置弹出菜单出现在那个组件上
     4         PopupMenu popupMenu = new PopupMenu(this, view);
     5 
     6         // 为弹出菜单添加菜单项
     7         // new PopupMenu().getMenu(),返回一个Menu对象
     8         getMenuInflater().inflate(R.menu.popup_menu, popupMenu.getMenu());
     9 
    10         // 设置弹出菜单项的监听事件
    11         popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
    12             @Override
    13             public boolean onMenuItemClick(MenuItem item) {
    14                 Toast.makeText(MainActivity.this, "点击了" + item.getTitle(),
    15                         Toast.LENGTH_SHORT).show();
    16                 return false;
    17             }
    18         });
    19 
    20         // 将弹出菜单显示出来
    21         popupMenu.show();
    22     }

    点击按钮出现的PopupMenu的效果图:

    示例:初始界面如下图,上方是一个ListView,下方是一个按钮,当点击返回键出现系统菜单,当点击ListView的任意一个数据项出现上下文菜单,当点击下方的按钮出现弹出菜单.

    MainActivity的源代码:

     1 package com.my.day22_my_menu;
     2 
     3 import android.os.Bundle;
     4 import android.app.Activity;
     5 import android.view.ContextMenu;
     6 import android.view.Menu;
     7 import android.view.MenuItem;
     8 import android.view.View;
     9 import android.view.ContextMenu.ContextMenuInfo;
    10 import android.widget.ArrayAdapter;
    11 import android.widget.ListView;
    12 import android.widget.PopupMenu;
    13 import android.widget.PopupMenu.OnMenuItemClickListener;
    14 import android.widget.Toast;
    15 
    16 public class MainActivity extends Activity {
    17     private ListView listView;
    18 
    19     @Override
    20     protected void onCreate(Bundle savedInstanceState) {
    21         super.onCreate(savedInstanceState);
    22         setContentView(R.layout.activity_main);
    23 
    24         listView = (ListView) findViewById(R.id.listView);
    25         listView.setAdapter(new ArrayAdapter<String>(this,
    26                 android.R.layout.simple_list_item_1, new String[] { "第一条数据项",
    27                         "第二条数据项", "第三条数据项" }));
    28 
    29         // 为listView注册上下文菜单
    30         registerForContextMenu(listView);
    31     }
    32 
    33     // 创建系统菜单
    34     @Override
    35     public boolean onCreateOptionsMenu(Menu menu) {
    36         // 将Menu文件转化为菜单的菜单项
    37         getMenuInflater().inflate(R.menu.main, menu);
    38         return true;
    39     }
    40 
    41     // 设置点击系统菜单项的监听事件
    42     @Override
    43     public boolean onOptionsItemSelected(MenuItem item) {
    44         Toast.makeText(this, "点击了" + item.getTitle(), Toast.LENGTH_SHORT)
    45                 .show();
    46         return super.onOptionsItemSelected(item);
    47     }
    48 
    49     // 创建上下文菜单
    50     @Override
    51     public void onCreateContextMenu(ContextMenu menu, View v,
    52             ContextMenuInfo menuInfo) {
    53         // 将Menu文件转化为菜单的菜单项
    54         getMenuInflater().inflate(R.menu.context_menu, menu);
    55         super.onCreateContextMenu(menu, v, menuInfo);
    56     }
    57 
    58     // 设置点击上下文菜单项的监听事件
    59     @Override
    60     public boolean onContextItemSelected(MenuItem item) {
    61         Toast.makeText(this, "点击了" + item.getTitle(), Toast.LENGTH_SHORT)
    62                 .show();
    63         return super.onContextItemSelected(item);
    64     }
    65 
    66     // 点击按钮时,出现弹出菜单
    67     public void popupMenu(View view) {
    68         // 第二个参数是设置弹出菜单出现在那个组件上
    69         PopupMenu popupMenu = new PopupMenu(this, view);
    70 
    71         // 为弹出菜单添加菜单项
    72         // new PopupMenu().getMenu(),返回一个Menu对象
    73         getMenuInflater().inflate(R.menu.popup_menu, popupMenu.getMenu());
    74 
    75         // 设置弹出菜单项的监听事件
    76         popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {
    77             @Override
    78             public boolean onMenuItemClick(MenuItem item) {
    79                 Toast.makeText(MainActivity.this, "点击了" + item.getTitle(),
    80                         Toast.LENGTH_SHORT).show();
    81                 return false;
    82             }
    83         });
    84 
    85         // 将弹出菜单显示出来
    86         popupMenu.show();
    87     }
    88 }
    View Code

    未完,待续。

  • 相关阅读:
    阿里MaxCompute(原ODPS)如何修改列字段数据类型
    解决SQL语句在Dapper执行超时比Query慢的问题
    IIS部署FLASK网站
    如何在vscode中调试python scrapy爬虫
    [转]阿拉伯数字转一二三和壹贰叁
    第三册复习
    不知道的口语
    跟小丸子学基础口语21-25
    跟小丸子学基础口语16-20
    跟小丸子学基础口语11-15
  • 原文地址:https://www.cnblogs.com/enjoy-coding/p/4796202.html
Copyright © 2020-2023  润新知