练习选择菜单(optionmenu)、上下文菜单(Contextmenu)、弹出菜单(popupmenu)综合小demo

 

练习选择菜单(optionmenu)、上下文菜单(Contextmenu)、弹出菜单(popupmenu)综合小demo

 

                                        ————安德风

 

 

一、最终效果演示:

 

 

 

二、布局设计

1、activity_main.xml布局设计源代码

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:app="http://schemas.android.com/apk/res-auto"
 4     xmlns:tools="http://schemas.android.com/tools"
 5     android:layout_width="match_parent"
 6     android:layout_height="match_parent"
 7     android:orientation="vertical"
 8     tools:context=".MainActivity" >
 9 
10     <Button
11         android:id="@+id/context"
12         android:layout_width="match_parent"
13         android:layout_height="wrap_content"
14         android:text="上下文菜单" />
15 
16     <Button
17         android:id="@+id/popup"
18         android:layout_width="match_parent"
19         android:layout_height="wrap_content"
20         android:text="弹出菜单" />
21 </LinearLayout>

 

 

 

2、menu(菜单布局设计)

 

 

 2-1、上下文菜单(contextmenu)contextmenu.xml源代码

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <menu xmlns:android="http://schemas.android.com/apk/res/android">
 3 
 4     <item
 5         android:id="@+id/copy"
 6         android:title="复制" />
 7     <item
 8         android:id="@+id/paste"
 9         android:title="粘贴" />
10 </menu>

2-2、选择菜单(optionmenu)optionmenu.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 
 5     <item
 6         android:id="@+id/Create"
 7         android:title="创建"
 8         app:showAsAction="always"
 9         android:icon="@drawable/ic_launcher_background"
10         />
11     <!-- showAsAction属性值:
12     always:直接在标题栏显示
13     never:不显示
14     withText:控制图标和文本一起显示
15     ifRoom:有空间就显示(这个根据手机分辨率显示)-->
16 
17     <item
18         android:id="@+id/save"
19         android:title="保存"
20         />
21     <item
22         android:id="@+id/more"
23         android:title="更多功能……" >
24         <menu >
25             <item android:title="子菜单1" />
26             <item
27                 android:id="@+id/delete"
28                 android:title="删除" />
29             <item
30                 android:id="@+id/exite"
31                 android:title="退出" />
32         </menu>
33     </item>
34 </menu>

2-3、弹出菜单(opupmenu)opupmenu.xml源代码

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <menu xmlns:android="http://schemas.android.com/apk/res/android">
 3 
 4     <item
 5         android:id="@+id/rename"
 6         android:title="重命名" />
 7     <item
 8         android:id="@+id/cut"
 9         android:title="剪切" />
10 </menu>

 

 

三、功能实现 MainActivity.java源代码

  1 package com.example.menu2;
  2 
  3 import androidx.annotation.NonNull;
  4 import androidx.appcompat.app.AppCompatActivity;
  5 
  6 import android.os.Bundle;
  7 import android.util.Log;
  8 import android.view.ActionMode;
  9 import android.view.ContextMenu;
 10 import android.view.Menu;
 11 import android.view.MenuItem;
 12 import android.view.View;
 13 import android.widget.Button;
 14 import android.widget.PopupMenu;
 15 import android.widget.Toast;
 16 
 17 public class MainActivity extends AppCompatActivity {
 18 Button popunp;//声明弹出菜单按钮
 19     @Override
 20     protected void onCreate(Bundle savedInstanceState) {
 21         super.onCreate(savedInstanceState);
 22         setContentView(R.layout.activity_main);
 23 
 24         popunp=findViewById(R.id.popup);//寻找弹出菜单按钮ID
 25         popunp.setOnClickListener(new View.OnClickListener() { //给按钮建立监听器
 26             @Override   //实现按钮响应功能
 27             public void onClick(View v) {
 28                 //实例化PopupMenu对象(参数2:被View锁定)
 29                final PopupMenu menu=new PopupMenu(MainActivity.this,popunp);
 30               menu.getMenuInflater().inflate(R.menu.popupmenu,menu.getMenu());//加载弹出菜单布局文件
 31               //给弹出菜单建立监听器
 32                menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
 33                    @Override //实现弹出菜单交互功能
 34                    public boolean onMenuItemClick(MenuItem item) {
 35                        switch (item.getItemId()){
 36                            case R.id.rename:
 37                                Toast.makeText(MainActivity.this, "重命名", Toast.LENGTH_SHORT).show();
 38                                break;
 39                            case R.id.cut:
 40                                Toast.makeText(MainActivity.this, "剪切", Toast.LENGTH_SHORT).show();
 41                                break;
 42                        }
 43                        return false;
 44                    }
 45                });
 46               menu.show();//弹出菜单展示
 47             }
 48         });
 49 
 50 
 51 
 52         //实现上下文菜单绑定控件ID
 53         registerForContextMenu(findViewById(R.id.context));
 54 
 55         //在view长按事件中去启动上下文操作模式
 56 
 57         findViewById(R.id.context).setOnLongClickListener(new View.OnLongClickListener() {//按钮建立监听器
 58             @Override
 59             public boolean onLongClick(View v) {
 60                 startActionMode(cb);//开始启动活动模式
 61                 return false;
 62             }
 63         });
 64     }
 65 
 66 
 67     /**
 68      * 为按钮设置上下文操作模式:
 69      *①实现ActionMode.CallBack(活动模式来回调函数)
 70      * ②在view长按事件中去启动上下文操作模式
 71      */
 72 
 73 
 74         //实现ActionMode.CallBack(活动模式来回调函数)实例化
 75        ActionMode.Callback cb=new ActionMode.Callback() {
 76         @Override
 77         public boolean onCreateActionMode(ActionMode mode, Menu menu) {
 78             Log.e("TAG", "创建" );
 79             getMenuInflater().inflate(R.menu.contextmenu,menu);//加载上下文菜单布局文件
 80             return true;
 81         }
 82 
 83         @Override
 84         public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
 85             Log.e("TAG", "准备" );
 86             return true;
 87         }
 88 
 89         @Override
 90         public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
 91             Log.e("TAG", "点击" );
 92             switch (item.getItemId()){
 93                 case R.id.copy:
 94                     Toast.makeText(MainActivity.this, "复制", Toast.LENGTH_SHORT).show();
 95                     break;
 96                 case R.id.paste:
 97                     Toast.makeText(MainActivity.this, "粘贴", Toast.LENGTH_SHORT).show();
 98                     break;
 99             }
100             return true;
101         }
102 
103         @Override
104         public void onDestroyActionMode(ActionMode mode) {
105             Log.e("TAG", "结束" );
106         }
107 
108 
109     };
110 
111 
112 
113 
114 
115 
116 
117 /*
118     //上下文菜单实现区域
119 //创建上下文菜单方法
120     @Override
121     public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
122         getMenuInflater().inflate(R.menu.contextmenu,menu);//加载上下文菜单布局文件
123 
124     }
125 //实现上下菜单交互功能
126     @Override
127     public boolean onContextItemSelected(@NonNull MenuItem item) {
128        switch (item.getItemId()){
129            case R.id.copy:
130                Toast.makeText(this, "复制", Toast.LENGTH_SHORT).show();
131                break;
132            case R.id.paste:
133                Toast.makeText(this, "粘贴", Toast.LENGTH_SHORT).show();
134                break;
135 
136        }
137        return true;
138     }
139 
140 */
141 
142 
143 
144 
145 
146 
147 
148 
149 
150 
151 
152 
153 
154 
155 
156 
157     //选择菜单实现区域
158 
159 //选择菜单方法创建
160     @Override
161     public boolean onCreateOptionsMenu(Menu menu) {
162      getMenuInflater().inflate(R.menu.optionmenu,menu);//加载选择菜单布局文件
163         return true;
164     }
165 //选择菜单实现交互功能
166     @Override
167     public boolean onOptionsItemSelected(MenuItem item) {
168         switch (item.getItemId()){ //通过多分支选中选择菜单项目id
169             case R.id.Create:   //当选中的是创建菜单项目id时,则Toast弹出框输出“创建”
170                 Toast.makeText(this, "创建", Toast.LENGTH_SHORT).show();
171                 break;
172             case R.id.save: //当选中的是保存菜单项目id时,则Toast弹出框输出“创建”
173                 Toast.makeText(this, "保存", Toast.LENGTH_SHORT).show();
174                 break;
175             case R.id.delete: //当选中的是删除菜单项目id时,则Toast弹出框输出“创建”
176                 Toast.makeText(this, "删除", Toast.LENGTH_SHORT).show();
177                 break;
178             case R.id.exite: //当选中的是退出菜单项目id时,则执行退出当前界面
179                finish();
180         }
181         return true;
182     }
183 }

 

 

 

四、总结

学会选择菜单(optionmenu)、上下文菜单(Contextmenu)、弹出菜单(popupmenu)布局设计以及交互功能实现

我是安德风,以上就是简单概括总结,感谢大家关注与支持;有问题欢迎留言,看到后我会一一答复。

 

posted @ 2020-04-20 20:01  安德风  阅读(660)  评论(0编辑  收藏  举报