6

所以我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它时,它将根据当前是否显示子行来展开或折叠。我已将一个附加OnClickListenerImageView组行中。单击此ImageView按钮后,我将启动PopupMenu如下图所示:

在此处输入图像描述

在此处输入图像描述

显示并单击其中PopupMenu一项操作后,我想对该组的所有子项执行一项操作。问题是我无法确定ImageView单击的行。

我想出如何对所有孩子应用动作的唯一方法是ContextMenu如下图所示:

在此处输入图像描述

我想避免使用 aContextMenu因为组行上的 LongClick 对于用户来说可能并不明显,因为它会带来一些要在子行上执行的操作。我认为更明显的设计是将 a 锚定PopupMenu到一个ImageView(在我的情况下是一个菜单图标)并将操作应用于该组的子行。我怎样才能得到这个功能PopupMenu

4

2 回答 2

4

你需要:

  • View为 PopUpMenu 充气的地方(您的ImageView
  • APopUpMenu保存在 res/menu 中,在这种情况下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 (i.e. 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下面监听器的构造函数中给出的。当您创建此侦听器的实例时,ViewID 与 XML 布局中声明的相同。在运行时它会被更新,所以当方法onMenuItemClick被调用时,TextViewID 已经改变了。

这是代码:

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;
            }

        }
    }
}
于 2014-05-08T18:55:40.293 回答
4

所以我发现为了获得单击哪个菜单图标的上下文,我利用了类的setTag()getTag()方法,View并将这些方法应用于ImageView(菜单图标)。

于 2013-05-24T08:12:45.573 回答