如果一个View注册了上下文菜单,那么当长按该View时便会弹出一个浮动菜单,来供选择下一步操作。
实现这个功能需要调用setOnCreateContextMenuListener来注册一个监听器,那么它和注册长按监听器setOnLongClickListener有什么区别呢?下面会在代码中加以测试,通过添加打印发现,用户对某个View长按之后,首先触发的是onLongClick函数,执行onLongClick操作,然后根据onLongClick的返回值判断是不是执行OnCreateContextMenuListener函数;如果onLongClick返回false,则会继续执行OnCreateContextMenuListener函数,如果返回true,忽略OnCreateContextMenuListener函数。
public class MainActivity extends ActionBarActivity { ImageView mImageView ; MyContextMenuClickListener mContextListener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.fragment_main); mImageView = (ImageView) findViewById(R.id.image); mContextListener = new MyContextMenuClickListener(); mImageView.setOnCreateContextMenuListener(mContextListener); //test mImageView.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(View arg0) { // TODO Auto-generated method stub Log.d("Test", "onLongClick"); return false; } }); } private class MyContextMenuClickListener implements OnCreateContextMenuListener , OnMenuItemClickListener{ @Override public boolean onMenuItemClick(MenuItem item) { // TODO Auto-generated method stub switch(item.getItemId()){ case R.id.open: Log.d("Test", "click open"); break; case R.id.delete: Log.d("Test", "click delete"); break; case R.id.remove: Log.d("Test", "click remove"); break; default: break; } return true; } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { // TODO Auto-generated method stub Log.d("Test", "onCreateContextMenu"); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.context_menu, menu); LayoutInflater layoutInflater = getLayoutInflater(); View view = (View) layoutInflater.inflate( R.layout.menu_header, null); menu.setHeaderView(view); MenuItem open = menu.findItem(R.id.open); open.setOnMenuItemClickListener(mContextListener); MenuItem delete = menu.findItem(R.id.delete); delete.setOnMenuItemClickListener(mContextListener); MenuItem remove = menu.findItem(R.id.remove); remove.setOnMenuItemClickListener(mContextListener); } } }
<?xml version="1.0" encoding="UTF-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:id="@+id/CONTEXT_MENU"> <item android:id="@+id/delete" android:title="delete"/> <item android:id="@+id/open" android:title="open"/> <item android:id="@+id/remove" android:title="remove"/> </group> </menu>
<?xml version="1.0" encoding="UTF-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="wrap_content" android:layout_width="wrap_content" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="This is a Test" /> </LinearLayout>
如果需要自己关闭ContextMenu弹框,可以调用:
getActivity().closeContextMenu();