得到这样的文本菜单的PopupMenu的情况下(Get context of PopupMenu l

2019-09-04 05:32发布

所以我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如下图:

我想避免使用ContextMenu ,因为在一组排LongClick可能不是很明显对于用户弄清楚,它会带来一些行动来对孩子进行行。 我觉得比较明显的设计是锚定PopupMenuImageView (在我的情况下,一个菜单图标),并有动作被应用到该组的孩子行。 我怎样才能用这个功能PopupMenu

Answer 1:

所以我想通了,为了有点击了哪个菜单图标的一些方面,我使用的setTag()和getTag()的方法View类里应用这些方法的ImageView (菜单图标)。



Answer 2:

你需要:

  • 一个View ,其中膨胀的弹出菜单(您ImageView
  • 一个PopUpMenu保存在res /菜单,在这种情况下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在下面听众的构造。 当你创建这个监听器的情况下, View标识是在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;
            }

        }
    }
}


文章来源: Get context of PopupMenu like ContextMenu