美文网首页Android入门学习Android知识库Android
Android中Menu菜单的使用详解(大全)

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

作者: fengcz | 来源:发表于2017-04-07 01:45 被阅读1189次

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


    持续更新中...

    相关文章

      网友评论

      本文标题:Android中Menu菜单的使用详解(大全)

      本文链接:https://www.haomeiwen.com/subject/vducattx.html