2

コンストラクター値として属性セット(xml値)を取るカスタムビューがあります

public CustomView(Context context)  // No Attributes in this one.
{
    super(context);
    this(context, null, 0);
}

public CustomView(Context context, AttributeSet attrs) {
    super(context, attrs);
    this(context, attrs, 0)
}

public CustomView(Context context, AttributeSet attrs, int default_style) {
    super(context, attrs, default_style);
    readAttrs(context, attrs, defStyle);
    init();
}

フラグメントクラスでは、ビューを次のように設定しています

CustomView customView = (CustomView) view.findViewById(R.id.customView); 

カスタムビューには、高さ、幅、パディングなどのさまざまな値が含まれています。

必要な条件に基づいてこれらの値を変更し、カスタム ビューに戻します。onDrawメソッドに width height コードを配置し、invalidte ビューを呼び出しました。しかし、上記のメソッドは、CustomView クラスで無効化メソッドを呼び出した場合に毎回設定されます。これを克服して、コンストラクターのみで変更された属性セット値を渡すことができるようにするにはどうすればよいですか?

編集:新しい値で更新されたビューを取得できるように、属性コンストラクター中に設定されたビュー値を変更する(新しい値で初期化する)必要があります。@OnDraw または 'Invalidate' のオーバーライドは、invalidate の内部で 1 秒間隔ごとに実行されるメソッドを記述している私にとっては良い機能ではありません。

4

3 に答える 3

2

複数の属性を持つことCustomViewができ、いくつかの条件に基づいてこれらの属性の一部を変更し、これをコンストラクターに渡したいと考えています。

カスタム ビューを設計する際のベスト プラクティス:

  1. カスタム属性がある場合は、セッターとゲッターを介してそれらを公開してください。セッターメソッドで、呼び出しますinvalidate();
  2. onDraw()またはonMeasure()メソッド内の属性を変更しようとしないでください。
  3. カスタム ビューのカスタム コンストラクターを記述しないように最善を尽くしてください。

したがって、問題を解決する理想的な方法は、CustomView をインスタンス化してから、外部で (アクティビティまたはフラグメントで) 属性を変更するか、内部にメソッドをCustomView.java配置してから外部で呼び出すことです。これを行うと、探しているのと同じ結果が得られます。

于 2015-10-13T04:26:01.677 に答える
0

おそらくあなたが望んでいた解決策ではありませんが、 CustomView の代わりに xml に FrameLayout を配置FrameLayout親としてプログラムでCustomViewを作成します

于 2015-10-08T04:22:09.127 に答える