zoukankan      html  css  js  c++  java
  • Menu菜单

    1.概念

            <1>Android应用中的菜单默认是隐藏的,只有当用户点击手机上的MENU键,系统才会显示菜单。这种菜单叫做选项菜单(Option Menu)。
            <2>从3.0开始,Android不要求手机设备上必须提供MENU按键。因此Android推荐使用ActionBar来代替Menu。
    2、分类
            <1>OptionsMenu 按手机menu弹出的菜单
                    (1)重写public boolean onCreateOptionsMenu(menu)方法
    1. // 显示弹出菜单布局必须要重写的方法,在这个地方加载菜单文件
    2. @Override
    3. public boolean onCreateOptionsMenu(Menu menu) {
    4. getMenuInflater().inflate(R.menu.main, menu);
    5. setIconEnable(menu, true);
    6. // 必须要返回true
    7. return true;
    8. }
                    (2)创建菜单项MenuItem
                                    a.创建菜单XML文件,必须以<menu>为根标签
                                            菜单XML的位置:/res/menu/
                                            <item>标签属性
                                                    android:id表示item的id
                                                    android:icon表示菜单的图标,4.0系统仅在ActionBar上显示图标
                                                    android:title表示菜单的文字
                                            二级子菜单
    1. <?xml version="1.0" encoding="utf-8"?>
    2. <menu xmlns:android="http://schemas.android.com/apk/res/android">
    3. <item android:id="@+id/file"
    4. android:title="@string/file" >
    5. <!-- "file" 的子菜单 -->
    6. <menu>
    7. <item android:id="@+id/create_new"
    8. android:title="@string/create_new" />
    9. <item android:id="@+id/open"
    10. android:title="@string/open" />
    11. </menu>
    12. </item>
    13. </menu>
                                            二级组菜单
    1. <item
    2. android:id="@+id/menu_group2"
    3. android:orderInCategory="1"
    4. android:showAsAction="never"
    5. android:title="文字颜色">
    6. <menu >
    7. <group>
    8. <item android:id="@+id/font_red" android:title="red" />
    9. <item android:id="@+id/font_green" android:title="green"></item>
    10. <item android:id="@+id/font_blue" android:title="blue"></item>
    11. <item android:id="@+id/font_yellow" android:title="yellow"></item>
    12. </group>
    13. </menu>
    14. </item>
                                            二级可选组菜单
    1. <item
    2. android:id="@+id/menu_group1"
    3. android:orderInCategory="1"
    4. android:showAsAction="never"
    5. android:title="文字尺寸">
    6. <menu >
    7. <!-- android:checkableBehavior 属性有三个可选值:all为多选,single为单选,none为不可选。为none时就是一个普通菜单 -->
    8. <group android:checkableBehavior="single">
    9. <item android:id="@+id/font_10" android:title="10sp"></item>
    10. <item android:id="@+id/font_15" android:title="15sp"></item>
    11. <item android:id="@+id/font_20" android:title="20sp"></item>
    12. <item android:id="@+id/font_25" android:title="25sp"></item>
    13. <item android:id="@+id/font_30" android:title="30sp"></item>
    14. </group>
    15. </menu>
    16. </item>
                                            通过MenuInflater.inflater(int menuId,menu)方法将菜单项追加到菜单中
                                    b.menu.add()方法增加菜单
                                            menu.add()方法返回MenuItem对象
                                                    setIcon (int iconRes)
                                                    setTitle (CharSequence title)
                                                    setOnMenuItemClickListener(OnMenuItemClickListener)
                                                    setIntent(Intent)设置点击菜单项时打开的窗口
                                            menu.add(CharSequence) :一般使用方法,增加菜单名称
                                            menu.add(0, 1, 1, "拍照")
                                                    第一个参数为GroupID,Group即将菜单项分组
                                                    第二个参数为ItemID,指的是菜单项的id
                                                    第三个参数为order,指定菜单项的位置顺序
                                                    第四个参数为title,指的是菜单项所显示的文字
                    (3)重写public boolean onOptionsItemSelected(MenuItem item)方法,实现菜单项的选择事件
    1. // 要做弹出菜单的点击事件必须重写的方法
    2. @Override
    3. public boolean onOptionsItemSelected(MenuItem item) {
    4. // 获取被点击的菜单的id
    5. int id = item.getItemId();
    6. switch (id) {
    7. case R.id.item2:
    8. Toast.makeText(this, "清除"+item.getTitle(), Toast.LENGTH_SHORT).show();
    9. break;
    10. case R.id.item3:
    11. Toast.makeText(this, "杀毒"+item.getTitle(), Toast.LENGTH_SHORT).show();
    12. break;
    13. case R.id.item4:
    14. Toast.makeText(this, "拨号"+item.getTitle(), Toast.LENGTH_SHORT).show();
    15. break;
    16. default:
    17. break;
    18. }
    19. return super.onOptionsItemSelected(item);
    20. }
            <2>ContextMenu 长按绑定UI控件的上下文菜单(上下文菜单继承自android.view.Menu)
                    (1)上下文菜单与Options Menu最大的不同在于:
                                    Options Menu的拥有者是Activity,而上下文菜单的拥有者是Activity中的View;
    每个Activity最多只有一个Options Menu,它为整个Activity服务。而一个Activity往往有多个View,哪个View需要上下文菜单就通过registerForContextMenu(View view)给这个View注册上下文菜单。
                    (2)生成上下文菜单是通过Activity中的onCreateContextMenu()方法:
                                    onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)方法很像生成Options Menu的onCreateOptionsMenu(Menu menu)方法;
    两者的不同在于:onCreateOptionsMenu只在用户第一次按“Menu”键时被调用,而onCreateContextMenu会在用户每一次长按注册了上下文菜单的View时被调用。
                    (3)ContextMenuInfo 有什么用呢?
                                    当视图元素需要向上下文菜单传递一些信息,比如该View对应DB记录的id等,这就要使用ContextMenuInfo。需要传递额外信息的View需要重写getContextMenuInfo()方法,返回一个带有数据的ContextMenuInfo实现类对象。
                                    ContextMenuInfo携带了注册上下文菜单控件的一些额外信息。一般用在AdaterViews(例如:Spinner 、ListView或GridView)上,可以在ContextMenuInfo 中获取到适配器View中的position的信息。
                    (4)开发上下文菜单的步骤:
                                    重写onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo)方法;
                                    调用Activity的registerForContextMenu(View view)方法为view组件注册上下文菜单;(注册上下文菜单后,意味着用户长按该控件后显示上下文菜单)。
                                            创建菜单xml文件,必须以<menu>为根标签
                                            menu.setHeaderTitle(String) 设置窗口头的标题
                                            menu.setHeaderIcon(R.drawable.face) 设置窗口头的图标
                                    为菜单项提供响应,重写onContextItemSelected(MenuItem item)。
                                    Activity.registerForContextMenu(需要显示ContextMenu的控件)
            <3>PopupMenu  在指定UI控件的下方或上方显示的弹出菜单
                    (1)PopupMenu(Context context, View anchor): 第二个参数是指弹出菜单显示的哪一个控件的下方或上方
                    (2)MenuInflater.inflate(int menuResId,PopupMenu.getMenu()) 加载菜单资源到弹出菜单对象中
                    (3)setOnMenuItemClickListener() 设置弹出菜单项的点击事件
                    (4)show() 弹出菜单
                    (5)dismiss() 关闭菜单
            <4>解决菜单项不显示图标的问题
    1. //enable为true时,菜单添加图标有效,enable为false时无效。
    2. private void setIconEnable(Menu menu, boolean enable)
    3. {
    4. try
    5. {
    6. Class<?> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");
    7. Method m = clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class);
    8. m.setAccessible(true);
    9. //MenuBuilder实现Menu接口,创建菜单时,传进来的menu其实就是MenuBuilder对象(java的多态特征)
    10. m.invoke(menu, enable);
    11. } catch (Exception e)
    12. {
    13. e.printStackTrace();
    14. }
    15. }
  • 相关阅读:
    HTML_from
    HTML_img
    python_Django默认转换器
    python_虚拟环境
    python_正则表达式
    mysql_pymysql模块
    mysql_权限管理
    mysql_子查询
    sudo权限造成的故障
    22.Linux定时任务
  • 原文地址:https://www.cnblogs.com/android-blogs/p/5706517.html
Copyright © 2011-2022 走看看