2

背景

我有一个布局,它有一些特殊状态(比如被选中/按下),我希望设置它的孩子基于这个布局应用他们自己的可绘制对象。

我正在寻找一种替代方法,为它的每个孩子(甚至可能是它的所有后代)设置duplicateParentState为 true。

我试过的

我试图使自定义视图具有将其设置为每个子级的属性,但我找不到在哪个方法调用中将此属性应用于其所有子级。在我尝试过的每种方法中,它要么为 getChildCount() 返回 0,要么对孩子本身不做任何事情(使用setDuplicateParentStateEnabled())。

问题

正如文档所说,使用 setDuplicateParentStateEnabled 在我需要它的情况下不会做任何事情:

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

所以看来我用得太晚了,但我需要把它叫晚,因为孩子们还不存在于父母中......

问题

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

4

1 回答 1

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

于 2014-08-28T04:35:32.337 回答