单击子布局中的元素时,更改可扩展列表子视图的背景

时间:2013-09-25 10:05:27

标签: android background expandablelistview pressed

单击子项时,我需要在可扩展列表视图中更改子视图的背景。

子行布局类似于:

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

但这不会导致行布局改变背景颜色。

2 个答案:

答案 0 :(得分:1)

<强>问题:

最终你想从其childView中触发parentView的选择器。

<强>解决方案

在您的父版面中,添加以下行:

android:addStatesFromChildren="true"

如果你在java代码中有parentView的引用,那么你可以使用:

来完成任务
parentView.setAddStatesFromChildren(true);

其中,parentView是您的父布局,即:RelativeLayout

注意:

确保您的子视图不会重复父级的状态。 即:android:duplicateParentStatechildView.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       
               }
    }

我自己没有尝试过,目前无法设置测试项目。只是想给你一个替代的方法,以防你没有尝试类似的东西。