android 是否为每个子视图将duplicateParentState设置为true?

bvk5enib  于 2022-12-02  发布在  Android
关注(0)|答案(1)|浏览(165)

背景
我有一个布局,有一些特殊的状态(如被选中/按下),我希望设置它的孩子,以应用自己的绘图基于此布局。
我正在寻找一种替代方法,将duplicateParentState的每个子代(甚至可能是所有子代)都设置为true。
我所尝试的
我尝试过让自定义视图具有一个属性,将其设置为每个子视图,但我找不到在哪个方法调用中将此属性应用于其所有子视图。在我尝试过的每个方法中,它要么为getChildCount()返回0,要么只是不对子视图本身执行任何操作(使用setDuplicateParentStateEnabled())。

问题

如文档所述,使用setDuplicateParentStateEnabled不会在我需要它的情况下执行任何操作:
注意:在当前实现中,将视图添加到ViewGroup后将此属性设置为true可能根本不起作用.应始终从XML使用此属性,或在将此视图添加到ViewGroup前将其设置为true.
所以看起来我用得太晚了,但是我需要晚调用它,因为子对象还不存在于父对象中...
问题是
如何实现避免为每个子视图设置duplicateParentState,而只将其设置为父视图的功能?

bhmjp9jg

bhmjp9jg1#

像你说的那样,扩展小部件并覆盖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)。

相关问题