• Android菜单(menu)


    Android  菜单

    我们继续来进行学习,今天写一下在软件中用的还算较多的菜单。

    1、Menu

    菜单,很显然,作用就是点击不同的选项触发不同的方法。现在在安卓使用中推荐使用ActionBar,但这里我们还是对菜单进行一个简单的解释。

    菜单主要分为三类,选项菜单(Option Menu)、上下文菜单(Context Menu)和子菜单(Sub Menu),下面我们就一个一个来看一下。

    (1)选项菜单

    当用户单击软件上的菜单按钮,触发事件弹出的菜单框就是选项菜单。

    这是效果图

    先是布局代码

    布局为在res文件夹下新建一个menu文件夹,在此文件夹下建xml文件。

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <menu xmlns:android="http://schemas.android.com/apk/res/android"
     3     xmlns:app="http://schemas.android.com/apk/res-auto">
     4     <item
     5         android:id="@+id/mune_enter"
     6         android:orderInCategory="100"
     7         android:title="选项一"
     8         app:showAsAction="never"/>
     9     <item
    10         android:id="@+id/mune_setting"
    11         android:orderInCategory="100"
    12         android:title="选项二"
    13         app:showAsAction="never"/>
    14     <item
    15         android:id="@+id/mune_out"
    16         android:orderInCategory="100"
    17         android:title="选项三"
    18         app:showAsAction="never"/>
    19 </menu>

    解释一下其中一些属性

    • showAsAction 主要是针对这个菜单的显示起作用的,它有三个可选项
    1. always:总是显示在界面上
    2. never:不显示在界面上,只让出现在右边的三个点中
    3. ifRoom:如果有位置才显示,不然就出现在右边的三个点中

    下面是java代码

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
        //导入菜单布局
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
    
        //这里是点击菜单项的触发事件
        public boolean onOptionsItemSelected(MenuItem item) {
            switch (item.getItemId()) {
                case R.id.mune_enter:
                    Toast.makeText(this, "点击选项一", Toast.LENGTH_SHORT).show();
                    break;
                case R.id.mune_setting:
                    Toast.makeText(this, "点击选项二", Toast.LENGTH_SHORT).show();
    
                    break;
                case R.id.mune_out:
                    Toast.makeText(this, "点击选项三", Toast.LENGTH_SHORT).show();
                    break;
                default:
                    break;
            }
            return super.onOptionsItemSelected(item);
        }
    
    }

    (2)上下文菜单

     当用户长按Activity页面时,弹出的菜单被称为上下文菜单。一般情况下ContextMenu常用于ListView或者GridView。

    效果图

    先是布局文件

    这里的布局就是下载layout中,父布局为FrameLayout

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:id="@+id/container"
     4     android:layout_width="match_parent"
     5     android:layout_height="match_parent">
     6 
     7     <ListView
     8         android:id="@+id/mune_list"
     9         android:layout_width="wrap_content"
    10         android:layout_height="wrap_content" >
    11     </ListView>
    12 
    13 </FrameLayout>

    这里没什么要说的,直接看下面。

    java代码

    public class MainActivity extends AppCompatActivity {
    
        private ListView listview;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //加载数据
            showListView();
            // 注册上下文菜单
            this.registerForContextMenu(listview);
        }
        //加载数据
        private void showListView() {
            listview = (ListView) findViewById(R.id.mune_list);
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_1, getDate());
            listview.setAdapter(adapter);
        }
        //创建数据源
        private ArrayList<String> getDate() {
            ArrayList<String> list = new ArrayList<String>();
            for (int i = 0; i < 10; i++) {
                list.add("菜单" + i);
            }
            return list;
        }
        //添加上下文菜单的菜单项
        public void onCreateContextMenu(ContextMenu menu, View v,
                                        ContextMenu.ContextMenuInfo menuInfo) {
            menu.setHeaderTitle("上下文菜单");
            //加载上下文菜单内容
            menu.add(1, 1, 1, "选项一");
            menu.add(1, 2, 1, "选项二");
            menu.add(1, 3, 1, "选项三");
            super.onCreateContextMenu(menu, v, menuInfo);
        }
        //创建单击事件
        public boolean onContextItemSelected(MenuItem item) {
            switch (item.getItemId()) {
                case 1:
                    Toast.makeText(this, "点击选项一", Toast.LENGTH_SHORT).show();
                    break;
                case 2:
                    Toast.makeText(this, "点击选项二", Toast.LENGTH_SHORT).show();
                    break;
                case 3:
                    Toast.makeText(this, "点击选项三", Toast.LENGTH_SHORT).show();
                    break;
    
                default:
                    break;
            }
            return super.onContextItemSelected(item);
        }
    }

     (3)子菜单

    它就是将功能相同的操作进行分组显示,作用在选项菜单上,是选项菜单的二级菜单

    效果图

    先上布局文件

    其实布局文件中可以什么都没有

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:id="@+id/container"
     4     android:layout_width="match_parent"
     5     android:layout_height="match_parent">
     6 
     7     <TextView
     8         android:layout_width="wrap_content"
     9         android:layout_height="wrap_content"
    10         android:text="SubMenu"
    11         android:textSize="20dp" />
    12 
    13 </FrameLayout>

    然后是java代码

     1 public class MainActivity extends AppCompatActivity {
     2 
     3     @Override
     4     protected void onCreate(Bundle savedInstanceState) {
     5         super.onCreate(savedInstanceState);
     6         setContentView(R.layout.activity_main);
     7     }
     8     @Override
     9     public boolean onCreateOptionsMenu(Menu menu) {
    10         SubMenu fileMenu = menu.addSubMenu("查看");
    11         SubMenu editMenu = menu.addSubMenu("输入");
    12         //添加菜单项
    13         fileMenu.add(1, 1, 1, "查看1");
    14         fileMenu.add(1, 2, 1, "查看2");
    15         fileMenu.add(1, 3, 1, "查看3");
    16         editMenu.add(2, 1, 1, "输入1");
    17         editMenu.add(2, 2, 1, "输入2");
    18         editMenu.add(2, 3, 1, "输入3");
    19         return super.onCreateOptionsMenu(menu);
    20     }
    21     //创建点击事件
    22     public boolean onOptionsItemSelected(MenuItem item) {
    23         if (item.getGroupId() == 1) {
    24             switch (item.getItemId()) {
    25                 case 1:
    26                     Toast.makeText(this, "点击了查看1", Toast.LENGTH_SHORT).show();
    27                     break;
    28                 case 2:
    29                     Toast.makeText(this, "点击了查看2", Toast.LENGTH_SHORT).show();
    30                     break;
    31                 case 3:
    32                     Toast.makeText(this, "点击了查看3", Toast.LENGTH_SHORT).show();
    33                     break;
    34                 default:
    35                     break;
    36             }
    37         } else if (item.getGroupId() == 2) {
    38             switch (item.getItemId()) {
    39                 case 1:
    40                     Toast.makeText(this, "点击了输入1", Toast.LENGTH_SHORT).show();
    41                     break;
    42                 case 2:
    43                     Toast.makeText(this, "点击了输入2", Toast.LENGTH_SHORT).show();
    44                     break;
    45                 case 3:
    46                     Toast.makeText(this, "点击了输入3", Toast.LENGTH_SHORT).show();
    47                     break;
    48                 default:
    49                     break;
    50             }
    51         }
    52         return super.onOptionsItemSelected(item);
    53     }
    54 }

    上面就是菜单的用法了。。。。。。。

    说一下ContextMenu与OptionMenu的区别:

    • 1、OptionMenu对应的是activity,一个activity只能拥有一个选项菜单;
    • 2、ContextMenu对应的是view,每个view都可以设置上下文菜单;

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  • 相关阅读:
    HDU 2045 不容易系列之(3)—— LELE的RPG难题(递归/动态规划)
    UVALive 6885 spfa
    hdu 1142 A Walk Through the Forest spfa
    hdu 2795 Billboard 线段树
    hdu 1394 Minimum Inversion Number 线段树求逆序数
    hdu 1754 I Hate It 线段树-区间最值
    poj 1088 滑雪 动态规划
    poj 1163 The Triangle 动态规划
    hdu 1258 Sum It Up 搜索
    hdu 3006 The Number of set 状态压缩
  • 原文地址:https://www.cnblogs.com/QY-admin/p/9974575.html
Copyright © 2020-2023  润新知