Android ContextMenu 上下文菜单
Android ContextMenu
上下文菜单是在长按某个 View
后出现的菜单,我们需要为这个 View
注册上下文菜单
ContextMenu
Android 没有提供 XML 形式的 ContextMenu 创建方法,也没有提供实例化一个类的创建方法,而是通过重写 Activity
中的几个方法来创建
Activity
提供了以下方法来给当前的 Activity
提供上下文菜单操作
方法 | 说明 |
---|---|
onCreateContextMenu(menu, v,menuInfo) | 创建一个上下文菜单 |
onContextItemSelected(MenuItem item) | 当上下文菜单项被单击时触发 |
registerForContextMenu(view) | 给一个 view 注册上下文菜单 |
就简简单单三个方法,调用顺序是
-
重写
onCreateContextMenu(menu, v,menuInfo)
创建上下文菜单 -
重写
onContextItemSelected(MenuItem item)
响应上下文菜单的点击 -
在
onCreate()
中调用registerForContextMenu(view)
为一个View
注册上下文菜单
范例
下面我们就一步一步来创建一个 ContextMenu
吧,先放一下最后的效果图
-
创建一个 空的 Android 项目
cn.twle.android.ContextMenu
-
修改
activity_main.xml
添加一个 按钮 ( Button )<?xml version="1.0" encoding="utf-8" ?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal" android:orientation="vertical" > <Button android:id="@+id/btn_pop" android:text="长按我弹出上下文菜单" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
-
在
res
目录下新建一个资源目录menu
,然后在res/menu
目录下新建文件main_contextmenu.xml
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <!-- checkableBehavior 的可选值由三个:single设置为单选,all为多选,none为普通选项 --> <group android:checkableBehavior="none"> <item android:id="@+id/create" android:title="新建" /> <item android:id="@+id/edit" android:title="编辑" /> </group> <group android:checkableBehavior="single"> <item android:id="@+id/save" android:title="保存" /> <item android:id="@+id/save_as" android:title="另存为..." /> <item android:id="@+id/help" android:title="帮助" /> </group> </menu>
-
直接修改 MainActivity.java
package cn.twle.android.contextmenu; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.view.MenuInflater; import android.view.MenuItem; import android.view.ContextMenu; import android.widget.Toast; import android.widget.Button; public class MainActivity extends AppCompatActivity { final private int OPEN = 111; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btn_pop = (Button)findViewById(R.id.btn_pop); registerForContextMenu(btn_pop); } //重写上下文菜单的创建方法 @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { // 如果要给多个 view 注册上下文菜单,可以根据 v 参数来判断 MenuInflater inflator = new MenuInflater(this); inflator.inflate(R.menu.main_contextmenu, menu); menu.add(1,OPEN,1,"打开"); super.onCreateContextMenu(menu, v, menuInfo); } //上下文菜单被点击时触发该方法 @Override public boolean onContextItemSelected(MenuItem item) { // 菜单项被选中时触发 int id = item.getItemId(); String label = ""; switch (id){ case R.id.create: label = "新建"; break; case OPEN: label = "打开"; break; case R.id.help: label = "帮助"; break; } Toast.makeText(getApplicationContext(),"你点击了:" + label,Toast.LENGTH_SHORT).show(); return super.onContextItemSelected(item); } }