是否可以为每个子视图设置duplicateParentState为true?

时间:2013-11-26 09:15:25

标签: android android-layout android-drawable statelistdrawable

背景

我有一个具有一些特殊状态的布局(比如被检查/按下),我希望将其子设置为基于此布局应用自己的drawable。

我正在寻找另一种方法,让duplicateParentState为每个孩子(甚至可能是其所有后代)设置为真。

我尝试了什么

我试图让自定义视图具有将其设置为每个子节点的属性,但我无法找到将该属性应用于其所有子节点的方法调用。在我尝试的每种方法中,它为getChildCount()返回0或者它对子项本身没有任何作用(使用setDuplicateParentStateEnabled())。

问题

正如文档所说,使用setDuplicateParentStateEnabled对我需要的案例不会做任何事情:

  

注意:在当前实现中,将此属性设置为true   视图添加到ViewGroup后可能根本没有任何效果。   此属性应始终从XML使用或在之前设置为true   将此视图添加到ViewGroup。

所以我似乎用得太迟了,但我需要把它称之为晚,因为孩子们还没有在父母身上......

问题

如何实现避免为每个子设置duplicateParentState的功能,并将其设置为父视图?

1 个答案:

答案 0 :(得分:0)

如何扩展小部件 - 就像你说的那样 - 并覆盖onLayout()?这样,您可以确保在第一次绘制窗口小部件时修改子状态。当调用onLayout()时,getChildCount()将始终返回实际的子项数。例如:

public class LinearLayout extends android.widget.LinearLayout {

  private static final int[] VIEW_GROUP_ATTRS = new int[]{ android.R.attr.enabled };
  private static final boolean DEFAULT_IS_ENABLED = true;

  private boolean isEnabled = DEFAULT_IS_ENABLED;

  public LinearLayout(Context context) {
    super(context);
  }

  public LinearLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
    isEnabled = context.obtainStyledAttributes(attrs, VIEW_GROUP_ATTRS).getBoolean(0, DEFAULT_IS_ENABLED);
  }


  @Override
  public void setEnabled(boolean enabled) {
    super.setEnabled(enabled);
    this.isEnabled = enabled;

    for (int i = 0; i < getChildCount(); ++i) {
      getChildAt(i).setEnabled(enabled);
    }
  }

  @Override
  protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
    super.onLayout(changed, left, top, right, bottom);
    setEnabled(isEnabled);
  }
}

请注意,您实际上正在扩展窗口小部件(在被覆盖的任何方法上调用super)。