获取像ContextMenu一样的PopupMenu的上下文

所以我的ExpandableListView具有如下定义的组行:

group_row.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TextView android:id="@+id/GroupName" style="@style/ListViewRowStyle" android:paddingLeft="40dp" android:textSize="18sp" > </TextView> <ImageView android:id="@+id/Menu" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_marginTop="10dp" android:contentDescription="@string/default_content_description_text" android:src="@drawable/ic_menu_moreoverflow_normal_holo_light" > </ImageView> </RelativeLayout> 

当你点击TextView ,它将展开或折叠,取决于当前是否显示子行。 我已将OnClickListener附加到组行中的ImageView 。 当这个ImageView被点击时,我会像下面的图片一样启动一个PopupMenu

在这里输入图像描述

在这里输入图像描述

一旦PopupMenu被显示,并且其中一个动作被点击,我想对组中的所有孩子执行一个动作。 问题是我无法确定ImageView被点击的行。

我已经想出了如何将一个动作应用于所有孩子的唯一方法是使用如下图所示的ContextMenu

在这里输入图像描述

我想避免使用ContextMenu因为对于用户来说,组行上的LongClick可能不是显而易见的,因为它会调出子行上的一些操作。 我认为更明显的devise是将PopupMenu锚定到ImageView (在我的情况下是菜单图标),并将该操作应用于该组的子行。 我怎样才能用PopupMenu获得这个function?

所以我想出了为了让一些菜单图标被点击的上下文,我利用了View类的setTag()和getTag()方法,并将这些方法应用于ImageView (菜单图标)。

你需要:

  • View在哪里膨胀PopUpMenu(您的ImageView
  • 保存在res / menu中的PopUpMenu ,在这里是popup_select_deselect.xml
  • 您自己的onMenuItemClickListener声明为内部类,在这种情况下onMenuItemClickListener_View

码:

 //TODO initialize rows[] for (int i = 0; i < rows.lenght; i++){ //inflate you group_row getLayoutInflater().inflate(R.layout.group_row, (ViewGroup)findViewById(R.id.rows_container)); ImageView v_Overflow = (ImageView)findViewById(R.id.Menu); //Set onClickListener v_Overflow.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { View v_Button = v; PopupMenu pum= new PopupMenu(YourActivity.this, v); //set my own listener giving the View that activates the event onClick (ie YOUR ImageView) pum.setOnMenuItemClickListener(new onMenuItemClickListener_View(v) ); //inflate your PopUpMenu getMenuInflater().inflate(R.menu.popup_select_deselect, pum.getMenu()); pum.show(); } }); //Update the id of your TextView .setId(i); //the i value will be your UNIQUE id for the ImageView } 

上面的代码只是您自己的OnMenuItemClickListener将执行的静态声明。

注意下面的监听器的构造函数中给定的View 。 当您创build此侦听器的实例时, View ID与XML布局中声明的相同。 在运行时它将被更新,所以当onMenuItemClick方法被调用时, TextView ID已经被改变了。

代码如下:

 private class onMenuItemClickListener_View implements OnMenuItemClickListener{ View v_View; public onMenuItemClickListener_View(View v){ v_View=v; } @Override public boolean onMenuItemClick(MenuItem item) { int i = v_View.getId(); switch (item.getItemId()) { case R.id.popupItemSelectAll: Toast.makeText(YourActivity.this, "Popup Select All for View #: " + rows[i], Toast.LENGTH_SHORT).show(); //TODO your code to select all return true; case R.id.popupItemDeselectAll: Toast.makeText(YourActivity.this, "Popup Deselect All for View #: " + rows[i], Toast.LENGTH_SHORT).show(); //TODO your code to deselect all return true; default: return false; } } } }