继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Menu菜单

繁华开满天机
关注TA
已关注
手记 134
粉丝 15
获赞 68

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.   

8.            <!-- android:checkableBehavior 属性有三个可选值:all为多选,single为单选,none为不可选。为none时就是一个普通菜单 -->

9.   

10.             <group android:checkableBehavior="single">

11.                 <item android:id="@+id/font_10" android:title="10sp"></item>

12.                 <item android:id="@+id/font_15" android:title="15sp"></item>

13.                 <item android:id="@+id/font_20" android:title="20sp"></item>

14.                 <item android:id="@+id/font_25" android:title="25sp"></item>

15.                 <item android:id="@+id/font_30" android:title="30sp"></item>

16.             </group>

17.         </menu>

18.     </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.  

17.               default:

18.                     break;

19.               }

20.               return super.onOptionsItemSelected(item);

21.        }

        <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.                

10.             //MenuBuilder实现Menu接口,创建菜单时,传进来的menu其实就是MenuBuilder对象(java的多态特征) 

11.             m.invoke(menu, enable); 

12.               

13.         } catch (Exception e)  

14.         { 

15.             e.printStackTrace(); 

16.         } 

17.     }  

原文链接:http://www.apkbus.com/blog-815579-61221.html

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP