所以我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可能不是很明显对于用户弄清楚,它会带来一些行动来对孩子进行行。 我觉得比较明显的设计是锚定PopupMenu
到ImageView
(在我的情况下,一个菜单图标),并有动作被应用到该组的孩子行。 我怎样才能用这个功能PopupMenu
?
所以我想通了,为了有点击了哪个菜单图标的一些方面,我使用的setTag()和getTag()的方法View
类里应用这些方法的ImageView
(菜单图标)。
你需要:
- 一个
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;
}
}
}
}