OptionMenu基本使用

下图是一个基本的OptionMenu,基本使用是三个步骤:创建资源文件、重写onCreateOptionsMenu加载菜单、重写onOptionsItemSelected处理点击事件。

Step1:创建资源文件

上图图中的三个点是其他隐藏的菜单,以下我们成为折叠菜单。

这里简单说一下showAsAction,它包含但不仅有以下几种:

1、always

表示无论标题栏是否有地方,都显示在最上方,而不显示在折叠菜单中。

2、never

永远显示在折叠菜单中。

3、ifRoom

如果标题栏有地方就显示在标题栏,否则显示在折叠菜单中。

xmlns:app="http://schemas.android.com/apk/res-auto">

android:id="@+id/btnAdd"

android:icon="@mipmap/add"

android:title="Add"

app:showAsAction="always">

android:id="@+id/btnEdit"

android:icon="@mipmap/edit"

android:title="Edit"

app:showAsAction="always">

OptionMenu可同时在Activity和Fragment中加载,以下将演示两种方式。

在Activity中加载OptionMenu

Step2:重写onCreateOptionsMenu加载菜单

@Override

public boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.menu_home, menu);

return true;

}

重写后要返回true,否则菜单不会显示,通过下图在Activity中的onCreateOptionsMenu注释就可以知道。

译为:为了显示这个menu,你必须返回true,如果你返回false这个menu将不会被显示出来。

Step3:重写onOptionsItemSelected处理点击事件

参数传来的就是我们点中的MenuItem对象,从中可以拿到Titile、Id等。如果这里不想将事件交给下一级处理直接返回true即可(这里主要是在Fragment也加载了OptionMenu的情况下,在下边展开来说)。

@Override

public boolean onOptionsItemSelected(MenuItem item) {

Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT).show();

return true;

}

在Fragment中加载OptionMenu

以下是在Fragment中创建OptionMenu菜单,大致和Activity的差不多,不过有一点需要注意,就是我们必须设置setHasOptionsMenu(true)才会被显示出来。这样它就会被加载到它所处的Activity中了。如果Activity也有菜单那么会被合并在一起。如果我们Activity和Fragment同时都有,那么当点击某一个菜单项时会优先调用Activity中的onOptionsItemSelected,进而在调用Fragment中的,如果Activity中的onOptionsItemSelected返回了true则不会走到Fragment的onOptionsItemSelected(这里需要注意!)。

@Override

public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

inflater.inflate(R.menu.menu_test1, menu);

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

Toast.makeText(getContext(), item.getTitle(), Toast.LENGTH_SHORT).show();

return true;

}

//注意下方代码!!!

@Override

public void onCreate(@Nullable Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setHasOptionsMenu(true);

}

动态操作Menu菜单

很多时候我们会根据实际需求在运行时动态的添加、移除、禁用、修改菜单,这些都是可以做到的,而且相对也比较简单,我们只需要保留在onCreateOptionsMenu的Menu对象即可,然后对这个对象进行操作就能实现这些功能。

private Menu mMenu;

@Override

public boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.menu_home, menu);

this.mMenu = menu;

return false;

}

int menuId = R.id.btnAdd;//菜单的ID

MenuItem menuItem = mMenu.findItem(menuId);//通过菜单ID找到菜单对象

//修改一个菜单项

menuItem.setTitle("New Title");

//禁用一个菜单项

menuItem.setEnabled(false);

//删除一个菜单项

mMenu.removeItem(menuId);

//隐藏一个菜单项

menuItem.setVisible(false);

//添加一个菜单项

mMenu.add("Add Menu");

其他:

如果你想要重新加载Menu可以调用Activity提供的invalidateOptionsMenu()函数。这里还需要说一个方法onPrepareOptionsMenu,它是在onCreateOptionsMenu之后的一个回调函数,通常在这里处理一些对菜单内容的修改。

@Override

public boolean onPrepareOptionsMenu(Menu menu) {

return super.onPrepareOptionsMenu(menu);

}

以下是Activity类中的onPrepareOptionsMenu,这里我们主要来看它的注释。

译为:为屏幕的标准选项菜单的显示做准备。在菜单显示之前会被调用。你可以使用这个方法高效地开启/禁用菜单项,以及动态地修改其内容。

/**

* Prepare the Screen's standard options menu to be displayed. This is

* called right before the menu is shown, every time it is shown. You can

* use this method to efficiently enable/disable items or otherwise

* dynamically modify the contents.

*

*

The default implementation updates the system menu items based on the

* activity's state. Deriving classes should always call through to the

* base class implementation.

*

* @param menu The options menu as last shown or first initialized by

* onCreateOptionsMenu().

*

* @return You must return true for the menu to be displayed;

* if you return false it will not be shown.

*

* @see #onCreateOptionsMenu

*/

public boolean onPrepareOptionsMenu(Menu menu) {

if (mParent != null) {

return mParent.onPrepareOptionsMenu(menu);

}

return true;

}

创建多级菜单

这个实现起来也很简单,直接操作我们在step1创建的xml资源文件就行了。首先根节点是menu,然后有item,然后item中又可以有menu,但是在menu节点中只能插入item和group节点而不能插入menu节点。不过个人不太推荐嵌套太多,易用性才差。

xmlns:app="http://schemas.android.com/apk/res-auto">

android:id="@+id/btnAdd"

android:icon="@mipmap/add"

android:title="Add">

android:id="@+id/btnEdit"

android:icon="@mipmap/edit"

android:title="Edit">

继承父类的菜单

如果若干个Activity中存在相同的菜单和行为那么我们就可以抽出一个父类来专门处理这些行为。

Step1:创建资源文件

第一个名为menu_test1。

第二个名为menu_test2。

Step2:创建父Activity

我们让其创建了menu_test1菜单。

public class BaseActivity extends AppCompatActivity {

@Override

public boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.menu_test1, menu);

return true;

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

Toast.makeText(this, "BaseActivity:" + item.getTitle(), Toast.LENGTH_SHORT).show();

return super.onOptionsItemSelected(item);

}

}

Step3:继承父Activity

这里我们继承自上边创建的BaseActivity,我们在onCreateOptionsMenu中需要调用父类的onCreateOptionsMenu函数,然后再加载自己的。在onOptionsItemSelected函数我们调用了父类的onOptionsItemSelected函数用于让父类处理它的事件,当然我们也可以直接返回true,那么就不会调用父类的onOptionsItemSelected函数了,也就是把事件拦截了。当点击菜单中的某一项时会依次从当前所在的Activity向上进行回调。

public class MainActivity extends BaseActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

super.onCreateOptionsMenu(menu);

getMenuInflater().inflate(R.menu.menu_test2, menu);

return true;

}

@Override

public boolean onOptionsItemSelected(MenuItem item) {

Toast.makeText(this, "MainActivity:" + item.getTitle(), Toast.LENGTH_SHORT).show();

return super.onOptionsItemSelected(item);

//return true;

}

}

最终效果

Java里optionsMenu.add_Android中OptionMenu的使用总结相关推荐

  1. Java里optionsMenu.add_android创建optionsmenu的方法

    本文实例讲述了android创建optionsmenu的方法.分享给大家供大家参考.具体实现方法如下: 一.用xml配置 在res文件夹下新建menu文件夹,menu下新建options_menu.x ...

  2. java里 输出101-150中的素数

    输出101-150中的素数 public class CLASS { public static void main(String[] args){ int count=0; out: for(int ...

  3. Java里optionsMenu.add_NoActionBar主题下如何添加OptionsMenu

    菜单无法显示 为了不显示标题栏,所以主题使用了 NoActionBar,这也直接导致选项菜单无处显示 解决方案 添加一个ToolBar,自定义标题栏 android:layout_width=&quo ...

  4. JAVA里List集合中的对象根据对象的某个属性值降序或者升序排序java8

    package com.stream;import java.util.Comparator; import java.util.List;public class Test {public stat ...

  5. java里this.a=a_Ican'tgohomethisa-way为啥是thisa-way?-thisa-英语-那友持同学

    概述:本道作业题是那友持同学的课后练习,分享的知识点是thisa,指导老师为柳老师,涉及到的知识点涵盖:Ican\'tgohomethisa-way为啥是thisa-way?_-thisa-英语,下面 ...

  6. java类里面再定一个类_java类的里面可以再定义一个类吗 java里可不可以在一个...

    java类里面还可以定义一个类,即内部类. java内部类分为: 成员内部类.静态嵌套类.方法内部类.匿名内部类 . 内部类的共性 (1).内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的. ...

  7. 在java中写出html代码,在java里写html代码

    在java里写html代码 [2021-02-09 07:31:38]  简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace("/ ...

  8. java 里 泛型中 T代表什么类型

    java 里 泛型中 <T>代表什么类型呀? public <T> List<T> find(String sql, Class<T> entityCl ...

  9. java中 try用法,Java里try catch的简单用法

    优质回答 回答者:temps1991 Java里try catch的简单用法: 1.try+catch 程序的流程是:运行到try块中,如果有异常抛出,则转到catch块去处理.然后执行catch块后 ...

最新文章

  1. 爬虫之Xpath详解
  2. 【OpenCV 4开发详解】方框滤波
  3. vue国际化-vue-i18n的配置
  4. 人工智能的2020:泡沫破灭?还是最后的狂欢?
  5. 在Ubuntu中使用远程桌面
  6. pytorch使用mean降维打击
  7. MVC3.0删除数据的时候给提示信息
  8. 神经网络测试时间计算机,卷积神经网络的时代到此结束了?
  9. 一个实际的例子学习 SAP BTP Java 应用的 @Before 注解使用方式
  10. python新闻评论分析_从新闻文章中提取评论
  11. git版本管理使用指南(附带repo)
  12. MFC多线程的创建,包括工作线程和用户界面线程
  13. python中session的使用方法_python中requests库session对象的妙用详解
  14. c语言float如何做减法,利用c语言设计开发一个简单计算器,可进行加减乘除运算....
  15. C语言学习笔记---结构体中的字符数组和字符指针
  16. java-字符串反转
  17. CSS层叠样式表的理解(一)
  18. python从入门到精通需要多久-学Python编程难吗 从入门到精通学习Python要多久
  19. 解决U盘1KB快捷方式病毒(暴风一号)方法
  20. vue的json格式化工具json-viewer

热门文章

  1. python --闭包学习
  2. linux 安全 ***检测 杀毒 rootkit
  3. iOS开发那些事-平铺导航–基于分屏导航及案例实现
  4. C# 窗体实例化一次
  5. 狂风暴雨——电闪雷鸣篇:数据流层核心思想揭秘
  6. SpringMVC启动后自动执行
  7. linux shell 查看 cpu核数
  8. linux flatpak 简介 同一个应用在不同linux发行版运行
  9. golang 面向对象编程
  10. 什么是ATL? (与COM的关系,及MFC与COM的关系)