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

问题描述 投票:0回答:1

背景

我有一个具有一些特殊状态(例如被选中/按下)的布局,我希望设置其子级以基于此布局应用自己的可绘制对象。

我正在寻找一种替代方案,将 duplicateParentState 设置为 true ,为其每个子级(甚至可能是其所有后代)。

我尝试过的事情

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

问题

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

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

所以看来我用它太晚了,但我需要晚点调用它,因为孩子在父母中还不存在......

问题

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

android android-layout android-drawable statelistdrawable
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)。

© www.soinside.com 2019 - 2024. All rights reserved.