View(视图)——菜单Menu

一.分类

   1.选项菜单  OptionMenu

     1>按menu键触发

     2>事件源时Activity

   2.上下文菜单  ContextMenu

      长按组件时触发。

   3.子菜单 SubMenu

      addSubMenu()添加子菜单。

1  <?xml version="1.0" encoding="utf-8"?>
2  <menu xmlns:android="http://schemas.android.com/apk/res/android">
3  
4      <item  android:id="@+id/me_1" android:title="删除"/>
5      <item  android:id="@+id/me_2" android:title="修改"/>
6  </menu>
Menu
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent"
 6     android:paddingBottom="@dimen/activity_vertical_margin"
 7     android:paddingLeft="@dimen/activity_horizontal_margin"
 8     android:paddingRight="@dimen/activity_horizontal_margin"
 9     android:paddingTop="@dimen/activity_vertical_margin"
10     tools:context="com.example.wang.testapp2.TestActivity3"
11     android:orientation="vertical">
12 
13     <Button
14         android:layout_width="match_parent"
15         android:layout_height="wrap_content"
16         android:text="按钮"
17         android:id="@+id/bt_1"/>
18 
19     <Button
20         android:layout_width="match_parent"
21         android:layout_height="wrap_content"
22         android:text="上下文菜单按钮"
23         android:id="@+id/bt_2"/>
24 
25 </LinearLayout>
26 
27  SubMenu
SubMenu
  1 package com.example.wang.testapp2;
  2 
  3 import android.app.Activity;
  4 import android.os.Bundle;
  5 import android.support.v7.app.AppCompatActivity;
  6 import android.view.ContextMenu;
  7 import android.view.Menu;
  8 import android.view.MenuInflater;
  9 import android.view.MenuItem;
 10 import android.view.SubMenu;
 11 import android.view.View;
 12 import android.widget.Button;
 13 import android.widget.Toast;
 14 
 15 public class TestActivity3 extends Activity {
 16 
 17     Button bt_1;
 18     Button bt_2;
 19 
 20     @Override
 21     protected void onCreate(Bundle savedInstanceState) {
 22         super.onCreate(savedInstanceState);
 23         setContentView(R.layout.activity_test3);
 24 
 25         bt_1=(Button)findViewById(R.id.bt_1);
 26         bt_2=(Button)findViewById(R.id.bt_2);
 27 
 28         //给组件添加上下文菜单  Activity是OnCreateContextMenuListener的实现类
 29         bt_2.setOnCreateContextMenuListener(
 30                 this
 31         );
 32 
 33         //点击
 34           bt_1.setOnClickListener(new View.OnClickListener() {
 35         @Override
 36         public void onClick(View v) {
 37 
 38             Toast.makeText(TestActivity3.this, "按钮被点击了", Toast.LENGTH_SHORT).show();
 39         }
 40     });
 41 
 42 
 43     //长按
 44     bt_1.setOnLongClickListener(new View.OnLongClickListener() {
 45         @Override
 46         public boolean onLongClick(View v) {
 47 
 48 
 49             Toast.makeText(TestActivity3.this, "按钮被长按了", Toast.LENGTH_SHORT).show();
 50 
 51             //事件是否已经被消费
 52             return true;
 53         }
 54     });
 55 }
 56 
 57     //重写创建上下文菜单的方法
 58     @Override
 59     public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
 60         super.onCreateContextMenu(menu, v, menuInfo);
 61 
 62         menu.add(1, 0, 1, "字体大小");
 63         menu.add(1,1,2,"背景颜色");
 64 
 65         //添加子菜单
 66         SubMenu sm=menu.addSubMenu(1,2,3,"子菜单");
 67 
 68         sm.add(2, 21, 0, "子菜单1");
 69         sm.add(2, 22, 1,"子菜单2");
 70 
 71         //加载文件
 72         MenuInflater m=getMenuInflater();
 73         m.inflate(R.menu.test3_menu,menu);
 74     }
 75 
 76     @Override
 77     public boolean onContextItemSelected(MenuItem item) {
 78 
 79         Toast.makeText(TestActivity3.this, "上下文菜单的title="+item.getTitle(), Toast.LENGTH_SHORT).show();
 80 
 81         return super.onContextItemSelected(item);
 82     }
 83 
 84     //给Activity 添加选项菜单
 85     //重写
 86     @Override
 87     public boolean onCreateOptionsMenu(Menu menu) {
 88 
 89 
 90         //加载菜单文件方式
 91         //1-获得菜单加载器
 92         MenuInflater m=getMenuInflater();
 93 
 94         //2-加载菜单文件  1)菜单文件 2)当前菜单
 95         m.inflate(R.menu.test3_menu,menu);
 96 
 97 
 98         return super.onCreateOptionsMenu(menu);
 99     }
100 
101 }
102 
103 SubMenu
SubMenu

 

二.选项菜单  OptionMenu

   1.创建:重写 boolean  onCreateOptionMenu(Menu menu)

     1>纯Java代码:menu.add();

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent"
 6     android:paddingBottom="@dimen/activity_vertical_margin"
 7     android:paddingLeft="@dimen/activity_horizontal_margin"
 8     android:paddingRight="@dimen/activity_horizontal_margin"
 9     android:paddingTop="@dimen/activity_vertical_margin"
10     tools:context="com.example.wang.testapp2.TestActivity3"
11     android:orientation="vertical">
12 
13     <Button
14         android:layout_width="match_parent"
15         android:layout_height="wrap_content"
16         android:text="按钮"
17         android:id="@+id/bt_1"/>
18 </LinearLayout>
19 
20 OptionMenu
OptionMenu
 1 package com.example.wang.testapp2;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.support.v7.app.AppCompatActivity;
 6 import android.view.ContextMenu;
 7 import android.view.Menu;
 8 import android.view.MenuInflater;
 9 import android.view.MenuItem;
10 import android.view.SubMenu;
11 import android.view.View;
12 import android.widget.Button;
13 import android.widget.Toast;
14 
15 public class TestActivity3 extends AppCompatActivity {
16 
17     Button bt_1;
18 
19     @Override
20     protected void onCreate(Bundle savedInstanceState) {
21         super.onCreate(savedInstanceState);
22         setContentView(R.layout.activity_test3);
23 
24         bt_1=(Button)findViewById(R.id.bt_1);
25 
26     //点击
27           bt_1.setOnClickListener(new View.OnClickListener() {
28         @Override
29         public void onClick(View v) {
30 
31             Toast.makeText(TestActivity3.this, "按钮被点击了", Toast.LENGTH_SHORT).show();
32         }
33     });
34 
35 
36     //长按
37     bt_1.setOnLongClickListener(new View.OnLongClickListener() {
38         @Override
39         public boolean onLongClick(View v) {
40 
41 
42             Toast.makeText(TestActivity3.this, "按钮被长按了", Toast.LENGTH_SHORT).show();
43 
44             //事件是否已经被消费
45             return true;
46         }
47     });
48 }
49 
50       //给Activity 添加选项菜单
51     //重写
52     @Override
53     public boolean onCreateOptionsMenu(Menu menu) {
54 
55         //添加菜单
56         menu.add(1,1,0,"添加");
57         menu.add(1,2,2,"修改");
58         menu.add(1,3,1,"删除");
59 
60         return super.onCreateOptionsMenu(menu);
61     }
62 }
63 
64 OptionMenu
OptionMenu

2>加载menu资源文件

         1-获得Menu加载器: MenuInflater m=getMenuInflater();

         2-加载Menu资源文件:m.inflate(menu资源文件的id,menu当前菜单);

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent"
 6     android:paddingBottom="@dimen/activity_vertical_margin"
 7     android:paddingLeft="@dimen/activity_horizontal_margin"
 8     android:paddingRight="@dimen/activity_horizontal_margin"
 9     android:paddingTop="@dimen/activity_vertical_margin"
10     tools:context="com.example.wang.testapp2.TestActivity3"
11     android:orientation="vertical">
12 
13     <Button
14         android:layout_width="match_parent"
15         android:layout_height="wrap_content"
16         android:text="按钮"
17         android:id="@+id/bt_1"/>
18 
19 
20 </LinearLayout>
21 
22 OptionMenu
OptionMenu
1 <?xml version="1.0" encoding="utf-8"?>
2  <menu xmlns:android="http://schemas.android.com/apk/res/android">
3  
4     <item  android:id="@+id/me_1" android:title="删除"/>
5      <item  android:id="@+id/me_2" android:title="修改"/>
6  </menu>
menu
 1 package com.example.wang.testapp2;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.support.v7.app.AppCompatActivity;
 6 import android.view.ContextMenu;
 7 import android.view.Menu;
 8 import android.view.MenuInflater;
 9 import android.view.MenuItem;
10 import android.view.SubMenu;
11 import android.view.View;
12 import android.widget.Button;
13 import android.widget.Toast;
14 
15 public class TestActivity3 extends AppCompatActivity {
16 
17     Button bt_1;
18 
19     @Override
20     protected void onCreate(Bundle savedInstanceState) {
21         super.onCreate(savedInstanceState);
22         setContentView(R.layout.activity_test3);
23 
24         bt_1=(Button)findViewById(R.id.bt_1);
25 
26           //点击
27           bt_1.setOnClickListener(new View.OnClickListener() {
28         @Override
29         public void onClick(View v) {
30 
31             Toast.makeText(TestActivity3.this, "按钮被点击了", Toast.LENGTH_SHORT).show();
32         }
33     });
34 
35 
36     //长按
37     bt_1.setOnLongClickListener(new View.OnLongClickListener() {
38         @Override
39         public boolean onLongClick(View v) {
40 
41 
42             Toast.makeText(TestActivity3.this, "按钮被长按了", Toast.LENGTH_SHORT).show();
43 
44             //事件是否已经被消费
45             return true;
46         }
47     });
48 }
49 
50         //给Activity 添加选项菜单
51     //重写
52     @Override
53     public boolean onCreateOptionsMenu(Menu menu) {
54 
55         //加载菜单文件方式
56         //1-获得菜单加载器
57         MenuInflater m=getMenuInflater();
58 
59         //2-加载菜单文件  1)菜单文件 2)当前菜单
60         m.inflate(R.menu.test3_menu,menu);
61 
62 
63         return super.onCreateOptionsMenu(menu);
64     }
65 }
66 
67 OptionMenu
OptionMenu

 3>以上两种加载方式可以并存

   2. 回调:重写 boolean onOptionsItemSelected(MenuItem item)

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent"
 6     android:paddingBottom="@dimen/activity_vertical_margin"
 7     android:paddingLeft="@dimen/activity_horizontal_margin"
 8     android:paddingRight="@dimen/activity_horizontal_margin"
 9     android:paddingTop="@dimen/activity_vertical_margin"
10     tools:context="com.example.wang.testapp2.TestActivity3"
11     android:orientation="vertical">
12 
13     <Button
14         android:layout_width="match_parent"
15         android:layout_height="wrap_content"
16         android:text="按钮"
17         android:id="@+id/bt_1"/>
18 
19 </LinearLayout>
20 
21  OptionMenu
OptionMenu
1 <?xml version="1.0" encoding="utf-8"?>
2  <menu xmlns:android="http://schemas.android.com/apk/res/android">
3  
4      <item  android:id="@+id/me_1" android:title="删除"/>
5      <item  android:id="@+id/me_2" android:title="修改"/>
6  </menu>
Menu
 1 package com.example.wang.testapp2;
 2 
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.support.v7.app.AppCompatActivity;
 6 import android.view.ContextMenu;
 7 import android.view.Menu;
 8 import android.view.MenuInflater;
 9 import android.view.MenuItem;
10 import android.view.SubMenu;
11 import android.view.View;
12 import android.widget.Button;
13 import android.widget.Toast;
14 
15 public class TestActivity3 extends AppCompatActivity {
16 
17     Button bt_1;
18 
19     @Override
20     protected void onCreate(Bundle savedInstanceState) {
21         super.onCreate(savedInstanceState);
22         setContentView(R.layout.activity_test3);
23 
24         bt_1=(Button)findViewById(R.id.bt_1);
25 
26         //点击
27           bt_1.setOnClickListener(new View.OnClickListener() {
28         @Override
29         public void onClick(View v) {
30 
31             Toast.makeText(TestActivity3.this, "按钮被点击了", Toast.LENGTH_SHORT).show();
32         }
33     });
34 
35 
36     //长按
37     bt_1.setOnLongClickListener(new View.OnLongClickListener() {
38         @Override
39         public boolean onLongClick(View v) {
40 
41 
42             Toast.makeText(TestActivity3.this, "按钮被长按了", Toast.LENGTH_SHORT).show();
43 
44             //事件是否已经被消费
45             return true;
46         }
47     });
48 }
49 
50     //给Activity 添加选项菜单
51     //重写
52     @Override
53     public boolean onCreateOptionsMenu(Menu menu) {
54 
55         //加载菜单文件方式
56         //1-获得菜单加载器
57         MenuInflater m=getMenuInflater();
58 
59         //2-加载菜单文件  1)菜单文件 2)当前菜单
60         m.inflate(R.menu.test3_menu,menu);
61 
62 
63         return super.onCreateOptionsMenu(menu);
64     }
65 
66     @Override
67     public boolean onOptionsItemSelected(MenuItem item) {
68 
69         Toast.makeText(TestActivity3.this, "菜单项的id="+item.getItemId()+"菜单项的title="+item.getTitle(), Toast.LENGTH_SHORT).show();
70 
71         //怎么判断菜单文件里的菜单哪个被选中了
72         if(item.getItemId()==R.id.me_1)
73         {
74             Toast.makeText(TestActivity3.this, "执行删除动作", Toast.LENGTH_SHORT).show();
75         }
76         else if (item.getItemId()==R.id.me_2)
77         {
78             Toast.makeText(TestActivity3.this, "执行修改动作", Toast.LENGTH_SHORT).show();
79         }
80 
81 
82         return super.onOptionsItemSelected(item);
83     }
84 }
85 
86 OptionMenu
OptionMenu

 

 

三.上下文菜单  ContextMenu

   1.Activity是OnCreateContextMenuListener的实现类

   2.创建:组件.setOnCreateContextMenuListener(this):在代码里添加MenuItem,方式同 选择菜单。

   3.响应: 重写Activity的boolean   onContextItemSelected(MenuItem item)

   4.与LongClick监听器的关系

     1>LongClick监听器的优先级高

     2>boolean onLongClick(View v)的返回值决定后续的监听器能否再继续处理

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:tools="http://schemas.android.com/tools"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent"
 6     android:paddingBottom="@dimen/activity_vertical_margin"
 7     android:paddingLeft="@dimen/activity_horizontal_margin"
 8     android:paddingRight="@dimen/activity_horizontal_margin"
 9     android:paddingTop="@dimen/activity_vertical_margin"
10     tools:context="com.example.wang.testapp2.TestActivity3"
11     android:orientation="vertical">
12 
13     <Button
14         android:layout_width="match_parent"
15         android:layout_height="wrap_content"
16         android:text="按钮"
17         android:id="@+id/bt_1"/>
18 
19     <Button
20         android:layout_width="match_parent"
21         android:layout_height="wrap_content"
22         android:text="上下文菜单按钮"
23         android:id="@+id/bt_2"/>
24 
25 </LinearLayout>
26 
27  ContextMenu
ContextMenu
  1 package com.example.wang.testapp2;
  2 
  3 import android.app.Activity;
  4 import android.os.Bundle;
  5 import android.support.v7.app.AppCompatActivity;
  6 import android.view.ContextMenu;
  7 import android.view.Menu;
  8 import android.view.MenuInflater;
  9 import android.view.MenuItem;
 10 import android.view.SubMenu;
 11 import android.view.View;
 12 import android.widget.Button;
 13 import android.widget.Toast;
 14 
 15 public class TestActivity3 extends Activity {
 16 
 17     Button bt_1;
 18     Button bt_2;
 19 
 20     @Override
 21     protected void onCreate(Bundle savedInstanceState) {
 22         super.onCreate(savedInstanceState);
 23         setContentView(R.layout.activity_test3);
 24 
 25         bt_1=(Button)findViewById(R.id.bt_1);
 26         bt_2=(Button)findViewById(R.id.bt_2);
 27 
 28         //给组件添加上下文菜单  Activity是OnCreateContextMenuListener的实现类
 29         bt_2.setOnCreateContextMenuListener(
 30                 this
 31         );
 32 
 33         //添加长按监听器
 34        bt_2.setOnLongClickListener(new View.OnLongClickListener() {
 35            @Override
 36             public boolean onLongClick(View v) {
 37 
 38                Toast.makeText(TestActivity3.this, "按钮被长按了", Toast.LENGTH_SHORT).show();
 39 
 40                return false;//true后面不在处理
 41             }
 42         });
 43         //点击
 44           bt_1.setOnClickListener(new View.OnClickListener() {
 45         @Override
 46         public void onClick(View v) {
 47 
 48             Toast.makeText(TestActivity3.this, "按钮被点击了", Toast.LENGTH_SHORT).show();
 49         }
 50     });
 51 
 52 
 53     //长按
 54     bt_1.setOnLongClickListener(new View.OnLongClickListener() {
 55         @Override
 56         public boolean onLongClick(View v) {
 57 
 58 
 59             Toast.makeText(TestActivity3.this, "按钮被长按了", Toast.LENGTH_SHORT).show();
 60 
 61             //事件是否已经被消费
 62             return true;
 63         }
 64     });
 65 }
 66 
 67     //重写创建上下文菜单的方法
 68     @Override
 69     public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
 70         super.onCreateContextMenu(menu, v, menuInfo);
 71 
 72         menu.add(1, 0, 1, "字体大小");
 73         menu.add(1,1,2,"背景颜色");
 74 
 75 
 76         //加载文件
 77         MenuInflater m=getMenuInflater();
 78         m.inflate(R.menu.test3_menu,menu);
 79     }
 80 
 81     @Override
 82     public boolean onContextItemSelected(MenuItem item) {
 83 
 84         Toast.makeText(TestActivity3.this, "上下文菜单的title="+item.getTitle(), Toast.LENGTH_SHORT).show();
 85 
 86         return super.onContextItemSelected(item);
 87     }
 88 
 89     //给Activity 添加选项菜单
 90     //重写
 91     @Override
 92     public boolean onCreateOptionsMenu(Menu menu) {
 93 
 94 
 95         //加载菜单文件方式
 96         //1-获得菜单加载器
 97         MenuInflater m=getMenuInflater();
 98 
 99         //2-加载菜单文件  1)菜单文件 2)当前菜单
100         m.inflate(R.menu.test3_menu,menu);
101 
102 
103         return super.onCreateOptionsMenu(menu);
104     }
105 
106 }
107 
108 ContextMenu
ContextMenu

原文地址:https://www.cnblogs.com/cycanfly/p/5485247.html