Android菜单类型

菜单是为了增加更多的功能,不占用屏幕的空间。Android中菜单类型有三类,选项菜单(OptionMenu)、上下文菜单(ContextMenu)、子菜单(SubMenu),下面分别详细介绍这些菜单。

选项菜单(OptionMenu

① 创建选项菜单:重写ActivityonCreateOptionMenuMenu menu)方法。

-设置菜单项可用代码动态设置menu.add();

-还可以通过xml设置MenuInflater.inflate();

②设置菜单点击事件:onOptionsItemSelected();

③菜单关闭后发生的动作:onOptionMenuClosed(Menu menu);

④选项菜单显示之前会调用,可以在这里根据需要调整菜单:onPrepareOptionsMenu(Menu menu);

⑤打开后发生的动作。 onMenuOpened(int featureId,Menu menu);

 

方法一:通过xml设置菜单(res/menu/menu.xml

                                  

标签的属性含义解释:

属性名

作用

menuCategory

设置菜单项的种类。有四个可选值:containersystemsecondaryalternative。通过menuCategory属性可以控制菜单项的位置。

orderInCategory

同类菜单的排列顺序,为整数值,值越大显示越靠前。

titleCondensed

菜单项的短标题。当菜单文字太长时显示这个

alphabeticShortcut

菜单项的字母快捷键。

showAsAction

Never:总是显示在移除菜单中。

Always:显示在ActionBar上。

ifRoom:如果actionBar空间足够就显示在ActionBar上。

withText:默认格式如果是含有文字和图表的话,只显示图标,使用ifRoom|withText可以显示图标和文字。

collapseActionView:

       android:title="@string/menu_search"
       android:icon="@drawable/ic_menu_search"

          android:showAsAction="ifRoom|collapseActionView"

           android:actionViewClass="android.widget.SearchView" />

android:showAsAction属性也可包含“collapseActionView”属性值,这个值是可选的,并且声明了这个操作视窗应该被折叠到一个按钮中,当用户选择这个按钮时,这个操作视窗展开。否则,这个操作视窗在默认的情况下是可见的,并且即便在用于不适用的时候,也要占据操作栏的有效空间。

参考链接:http://blog.csdn.net/think_soft/article/details/7370686

标签的作用是可以进行整组操作,把一些具有相同操作的菜单放到一个组内。

Activity里加载菜单

@Override    public boolean onCreateOptionsMenu(Menu menu) {        // Inflate the menu; this adds items to the action bar if it is present.        getMenuInflater().inflate(R.menu.menu, menu);        return true;    }

方法二:通过代码添加menu

@Override    public boolean onCreateOptionsMenu(Menu menu) {    //调用这个方法设置图标的可见性    setIconVisible(menu);        /*         * add()方法的四个参数,依次是:         * 1、组别,如果不分组的话就写Menu.NONE,         * 2、Id,这个很重要,Android根据这个Id来确定不同的菜单         * 3、顺序,那个菜单现在在前面由这个参数的大小决定,参数越小,显示的越前         * 4、文本,菜单的显示文本         */        menu.add(Menu.NONE, Menu.FIRST + 1, 5, "删除").setIcon(        android.R.drawable.ic_menu_delete);        // setIcon()方法设置菜单图标        menu.add(Menu.NONE, Menu.FIRST + 2, 2, "保存").setIcon(        android.R.drawable.ic_menu_save);        menu.add(Menu.NONE, Menu.FIRST + 3, 6, "帮助").setIcon(        android.R.drawable.ic_menu_help);        menu.add(Menu.NONE, Menu.FIRST + 4, 1, "添加").setIcon(        android.R.drawable.ic_menu_add);        menu.add(Menu.NONE, Menu.FIRST + 5, 4, "详细").setIcon(        android.R.drawable.ic_menu_info_details);        menu.add(Menu.NONE, Menu.FIRST + 6, 3, "发送").setIcon(        android.R.drawable.ic_menu_send);        return true;}//使用反射设置menu图标的可见性    private void setIconVisible(Menu menu) {try {Class clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");Method m = clazz.getDeclaredMethod("setOptionalIconsVisible",boolean.class);m.setAccessible(true);m.invoke(menu, true);} catch (Exception e) {e.printStackTrace();}}

菜单显示效果如下图:

选项菜单设置点击监听

@Override    public boolean onOptionsItemSelected(MenuItem item) {    Log.i(TAG, "onOptionsItemSelected");    int id = item.getItemId();    switch (id) {case Menu.FIRST+1:Toast.makeText(MenuActivity.this, "点击了删除按钮", Toast.LENGTH_SHORT).show();break;default:break;}        return super.onOptionsItemSelected(item);    }

上下文菜单

当用户长时间按键不放时,弹出来的菜单称为上下文菜单。Windows中用鼠标右键弹出的菜单就是上下文菜单。

 

创建上下文菜单的步骤:

① 调用registerForContextMenu()方法,为视图注册上下文菜单。如textView tv

registerForcontextMenu(tv);

@Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_menu);        tv = (TextView)findViewById(R.id.tv);        registerForContextMenu(tv);    }

② 覆盖ActivityonCreateContextMenu()方法,调用Menuadd方法添加菜单项(MenuItem

@Overridepublic void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {    setIconVisible(menu);// TODO Auto-generated method stub     menu.add(Menu.NONE, Menu.FIRST + 1, 5, "删除").setIcon(            android.R.drawable.ic_menu_delete);    // setIcon()方法设置菜单图标    menu.add(Menu.NONE, Menu.FIRST + 2, 2, "保存").setIcon(                android.R.drawable.ic_menu_save);    menu.add(Menu.NONE, Menu.FIRST + 3, 6, "帮助").setIcon(            android.R.drawable.ic_menu_help);    menu.add(Menu.NONE, Menu.FIRST + 4, 1, "添加").setIcon(            android.R.drawable.ic_menu_add);    menu.add(Menu.NONE, Menu.FIRST + 5, 4, "详细").setIcon(            android.R.drawable.ic_menu_info_details);    menu.add(Menu.NONE, Menu.FIRST + 6, 3, "发送").setIcon(            android.R.drawable.ic_menu_send);super.onCreateContextMenu(menu, v, menuInfo);}

③ 覆盖onContextItemSelected()方法,响应菜单单击事件。

@Overridepublic boolean onContextItemSelected(MenuItem item) {// TODO Auto-generated method stubint id = item.getItemId();    switch (id) {case Menu.FIRST+1:Toast.makeText(MenuActivity.this, "点击了删除按钮", Toast.LENGTH_SHORT).show();break;default:break;}return super.onContextItemSelected(item);}

显示效果

子菜单

子菜单:把相同功能的分组进行多组显示的菜单。

 

创建子菜单步骤:

① 覆盖ActivityonCreateOptionsMenu()方法,调用MenuaddSubMenu()方法添加子菜单项(subMenu

@Override    public boolean onCreateOptionsMenu(Menu menu) {    //调用这个方法设置图标的可见性    setIconVisible(menu);        /*         * add()方法的四个参数,依次是:         * 1、组别,如果不分组的话就写Menu.NONE,         * 2、Id,这个很重要,Android根据这个Id来确定不同的菜单         * 3、顺序,那个菜单现在在前面由这个参数的大小决定,参数越小,显示的越前         * 4、文本,菜单的显示文本         */             //添加子菜单          SubMenu subMenu = menu.addSubMenu(0,2,Menu.NONE, "难度星级->").setIcon(android.R.drawable.ic_menu_directions);            //添加子菜单项            subMenu.add(2, 100, 1, "☆☆☆☆☆");            subMenu.add(2, 101, 2, "☆☆☆");            subMenu.add(2, 102, 3, "☆");}

② 覆盖onOptionsItemSelected()方法响应点击事件。上下文菜单处理方式和此一致。

@Override    public boolean onOptionsItemSelected(MenuItem item) {    Log.i(TAG, "onOptionsItemSelected");    int id = item.getItemId();    switch (id) {case 100:Toast.makeText(MenuActivity.this, "点击了五颗星", Toast.LENGTH_SHORT).show();break;default:break;}        return super.onOptionsItemSelected(item);    }

PopuoMenu

PopupMenu可以非常方便的在指定view的下面显示一个弹出菜单,类似于actionbar溢出菜单的效果。它的菜单选项可以来自于menu资源

使用方法

①创建PopupMenu对象,绑定view

②加载布局文件

③设置MenuItemClickListener,处理点击监听

protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_menu);        tv = (TextView)findViewById(R.id.tv);        tv.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {PopupMenu popupMenu = new PopupMenu(MenuActivity.this, tv);  //加载菜单文件 popupMenu.getMenuInflater().inflate(R.menu.popup_menu,popupMenu.getMenu());        popupMenu.setOnMenuItemClickListener(new OnMenuItemClickListener() {@Overridepublic boolean onMenuItemClick(MenuItem item) {// TODO Auto-generated method stubint id = item.getItemId();switch (id) {case R.id.today:Toast.makeText(MenuActivity.this, "点击了今天", Toast.LENGTH_SHORT).show();break;default:break;}return false;}});        //显示popupMenu        popupMenu.show();}});    }

菜单文件popup_menu.xml

            










更多相关文章

  1. 计时器Chronometer和时钟(AnalogClock和DigitalClock)
  2. Android(安卓)3D引擎之min3D--支持材质和UV贴图的objloader
  3. Android(安卓)UI之代码动态设置ImageView的宽度和高度
  4. andriod 4.0以上版本不调用onConfigrationChange方法的解决办法
  5. Android多个React-Native模块的实现及源码解读
  6. [Android]Android开发艺术探索第13章笔记
  7. Android(安卓)自定义Toolbar的Menu菜单
  8. Android(安卓)使用SpannableString显示复合文本
  9. Android(安卓)Jetpack(二)ViewModel 组件原理剖析

随机推荐

  1. 唯品会商品图片批量保存,如何下载唯品会商
  2. 让一个销售笑,到底有多简单?
  3. 把锅甩给自己,把爽留给客户!
  4. Servlet基本概念及执行流程
  5. 刚开始接触苹果Mac,如何认识桌面上的基本
  6. PowerBI财报分析及综合报告制作
  7. 百亿级流量的百度搜索中台,是怎么做可观测
  8. 小马哥的 Java 项目实战营
  9. Spark RDD在Spark中的地位和作用如何?
  10. 网易严选商品详情采集工具