Android中Menu菜单的使用详解(大全)

1 在Activity中创建菜单

  • Activity中重写两个方法
 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        return super.onOptionsItemSelected(item);
  }
  • 创建资源文件
    res目录下创建menu目录,用来存放menu相关file
    创建资源文件menu_done
    每个item必须创建id
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">
    <item
        android:id="@+id/menu_area"
        android:orderInCategory="100"//数值越大级别越小,可设置来排位置
        android:title="@string/choice_area"//文字
        app:showAsAction="always" />//显示方式
    <item
        android:id="@+id/menu_icon"
        android:icon="@mipmap/icon_down"//当icon和title一起使用时,显示图标
        android:orderInCategory="100"
        android:title="@string/choice_area"
        app:showAsAction="always" />
</menu>
  • app:showAsAction="" 的含义
    always 任何情况都在toolbar显示
    ifRoom 当·toolbar·空间足够时,显示,不足时隐藏
    never 任何情况 不在toolbar上显示,点击在右上角的"更多"才能看见
    withText 图文(title+icon)显示
    collapseActionView 隐藏不直接显示
    menuCategory:同种菜单项的种类。该属性可取4个值:container、system、secondary和alternative。通过menuCategroy属性可以控制菜单项的位置。例如将属性设为system,表示该菜单项是系统菜单,应放在其他种类菜单项的后面。
  • 在Activity中加载资源文件
 @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        //load the file of menu that you created
        getMenuInflater().inflate(R.menu.menu_done, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.menu_area) {
            //TODO do everything what you want
            return true;
        } else {
            return super.onOptionsItemSelected(item);
        }
    }

2 在Fragment中创建菜单

fragment中创建menu菜单步骤和在activity中创建步骤一致,也有差别

  • 重写的方法
 //此方法与activity的有所不同
 @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
          super.onCreateOptionsMenu(menu, inflater);
    }
   @Override
    public boolean onOptionsItemSelected(MenuItem item) {
         return super.onOptionsItemSelected(item);
    }
  • 创建menu资源同activity中一致
  • 加载资源文件
 @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.menu_area, menu);
        super.onCreateOptionsMenu(menu, inflater);

    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.menu_area || id == R.id.menu_icon) {
            //TODO 选择区域
            item.setTitle("海淀区");

            return true;
        } else
            return super.onOptionsItemSelected(item);

    }

当这样写完了去奔跑起来的时候,你会发现想要的根本没有出现,接下来。。。。

  • 干货来了
    fragmentonCreate()方法中添加关键代码,允许添加
 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        /**
         * 在fragment创建menu关键方法
         */
        setHasOptionsMenu(true);
    }
  • 写在最后的话
    在上面的资源文件中定义了2个菜单项,一个显示文字在左侧,另一个显示的图标在文字右侧
  • 想要实现的效果是无论点击哪一个都去改变左侧文字
  • 实现方案
//在此方法中将要操作的MenuItem定义为全局变量
MenuItem item1;
    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.menu_area, menu);
        item1 = menu.findItem(R.id.menu_area);
        super.onCreateOptionsMenu(menu, inflater);

    }
   //在此方法中通过查找id,以此来确定响应事件
       @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        if (id == R.id.menu_area || id == R.id.menu_icon) {
            //TODO 选择区域
            item.setTitle("海淀区");//这种实际上是操纵2个菜单项
            item1.setTitle("改变了");//只操作所想的,perfect
            return true;
        } else
            return super.onOptionsItemSelected(item);

    }

如果您有更好的实现方法或是有更完善的,请给我留言更新,跪谢3分钟...


持续更新中...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,630评论 0 17
  • http://developer.android.youdaxue.com/guide/topics/ui/men...
    acc8226阅读 1,228评论 0 3
  • 原文地址:http://www.android100.org/html/201606/06/241682.html...
    AFinalStone阅读 1,019评论 0 1
  • ##Menu的创建,选择监听 ``` /** * 此方法用于初始化上下文菜单 并只会在第一次初始化菜单时调用 * ...
    lucky9322阅读 764评论 0 0
  • 一寸光阴一寸金,村金难买寸光阴。今日的时光今日过。时间对于人生来说也许并不是一个很大的概念。每天有那么久,过了一天...
    星的人阅读 241评论 0 0