2

バックグラウンド

いくつかの特別な状態 (チェック/押されているなど) を持つレイアウトがあり、このレイアウトに基づいて独自のドローアブルを適用するようにその子を設定したいと考えています。

私は、それぞれの子 (およびおそらくすべての子孫) に対してduplicateParentStateを true に設定する代替手段を探しています。

私が試したこと

カスタム ビューに各子に設定する属性を持たせようとしましたが、この属性をすべての子に適用するメソッド呼び出しが見つかりませんでした。私が試した各メソッドでは、 getChildCount() に対して 0 を返すか、子自体には何もしません ( setDuplicateParentStateEnabled()を使用) 。

問題

ドキュメントにあるように、 setDuplicateParentStateEnabled を使用しても、必要な場合は何もしません:

注: 現在の実装では、ビューが ViewGroup に追加された後にこのプロパティを true に設定しても、まったく効果がない可能性があります。このプロパティは、常に XML から使用するか、このビューを ViewGroup に追加する前に 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 に答える