练习选择菜单(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)布局设计以及交互功能实现
我是安德风,以上就是简单概括总结,感谢大家关注与支持;有问题欢迎留言,看到后我会一一答复。