单击子项时,我需要在可扩展列表视图中更改子视图的背景。
子行布局类似于:
<RelativeLayout> //Selector is placed for this layout
....
<RelativeLayout>
....
<RelativeLayout>
....
<TextView>
....
....
选择器:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:drawable= "@drawable/greyish"/>
</selector>
现在,当我点击TextView时,我想要更改整行的背景(最顶层的相对布局包含在子布局中的每个视图上)。如何触发顶级相对布局的选择器。
此外,当OnChildClick()收到回调时,行的背景会发生变化(因为选择器位于顶层布局中)。
我的尝试是:
在TextView的onlclick方法中:
((RelativeLayout)(nameView.getParent().getParent().getParent())).setPressed(true);
但这不会导致行布局改变背景颜色。
答案 0 :(得分:1)
<强>问题:强>
最终你想从其childView中触发parentView的选择器。
<强>解决方案强>
在您的父版面中,添加以下行:
android:addStatesFromChildren="true"
如果你在java代码中有parentView的引用,那么你可以使用:
来完成任务parentView.setAddStatesFromChildren(true);
其中,parentView是您的父布局,即:RelativeLayout
注意:强>
确保您的子视图不会重复父级的状态。
即:android:duplicateParentState
或childView.setDuplicateParentState(true)
我希望它会有所帮助!
答案 1 :(得分:0)
你能不能只为你希望元素着色的布局赋予一个id,然后是:
layout_with_child_views = (RelativeLayout)nameView.getRootView().findViewById(id)
如果您的方法返回正确的视图,那么您当然也可以坚持这一点。
然后获取所有子元素并更改背景颜色:
for (int i = 0; i < layout_with_child_views.getChildCount(); i++) {
View child = (View) layout_with_child_views
.getChildAt(i);
tintBackground(child);
}
private void tintBackground(View view) {
ColorDrawable[] color = { new ColorDrawable(Color.WHITE),
new ColorDrawable(Color.GREY) };
TransitionDrawable trans = new TransitionDrawable(color);
view.setBackgroundDrawable(trans);
trans.startTransition(500);
}
编辑:我一直在搜索abit,对我来说,似乎你应该能够使用ExpandableListView的可用侦听器,以便在你的ExpandableListAdapter中使用:
@Override
public void onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
// use the parent to set default color to all other entries
// v is the view within the expandable list/ListView that was clicked
for (int i = 0; i < v.getChildCount(); i++) {
View child = (View) v.getChildAt(i);
// do highlighting
}
}
我自己没有尝试过,目前无法设置测试项目。只是想给你一个替代的方法,以防你没有尝试类似的东西。