2

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

子行布局类似于:

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

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

4

2 回答 2

1

问题:

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

解决方案

在您的父布局中,添加以下行:

android:addStatesFromChildren="true"

如果您的 java 代码中有 parentView 的引用,那么您可以使用以下方法完成任务:

parentView.setAddStatesFromChildren(true);

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

笔记:

确保您的 childview 没有复制父母的状态。即:android:duplicateParentStatechildView.setDuplicateParentState(true)

我希望它会有所帮助!

于 2013-09-25T11:18:34.610 回答
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);

}

编辑:我一直在搜索,对我来说,您似乎应该能够使用 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       
               }
    }

我自己没有尝试过,目前无法设置测试项目。只是想为您提供一种替代方法,以防您没有尝试过类似的方法。

于 2013-09-25T10:24:17.643 回答