6

次のようなコードがあります。

public class CannonView extends SurfaceViewimplements SurfaceHolder.Callback{
Activity activity;

そしてそのコンストラクタ:

public CannonView(Context context, AttributeSet attrs){
Super(context,attrs)
activity = (Activity) context; 

しかし、どうやら AttributeSet は何もしていないようです。なぜそこにあるのかわからないので、私の質問は次のとおりです。1.-AttributeSet とは何ですか? 2.- なぜ 2 番目の引数として AttributeSet 属性を提供する必要があるのですか? ちなみに、残りのコードはキャンバスを使用したペイント用です。ありがとう。

4

3 に答える 3

3

ビューには 3 つのコンストラクターがあります。

SurfaceView(Context context)
SurfaceView(Context context, AttributeSet attrs)
SurfaceView(Context context, AttributeSet attrs, int defStyle)

注: 3 番目のスタイルは API レベル 11 で追加されました。ただし、新しいバージョンの API のカスタム ビューを作成する場合は、それを実装する必要があります。

カスタム ビューを実装するときに、広く使用できるようにする場合は、3 つのコンストラクターを実装する必要があります。これは、コードの別の部分または別のアプリでビューを別の方法で使用すると、任意のコンストラクターを使用してインスタンス化できるためです。

プログラムでビューを構築している場合は、使用するコンストラクターを決定できます。

ただし、ビューが XML から参照されると、Android フレームワークはビューをインスタンス化します。

<com.me.Common.MyView
   android:layout_width="wrap_contents"
...
/>

ビューをインスタンス化するこれらの XML 宣言には、多くの属性を含めることができます。そのうちのいくつかは、「android:」名前空間の標準の Android のものです。これらを拡張している SuperClass に渡すと (View クラスを拡張している場合はそのまま)、それらを解析して使用するため、多くのことを行う必要はありません。

ただし、独自の名前 name でカスタム属性を定義して使用することもできます

<com.me.Common.MyView
   android:layout_width="wrap_contents"
...
   com.me:num_elements="10"
/>

次に、コンストラクターで渡された属性セットを解析し、View オブジェクトの動作を変更して XML の設定を尊重する必要があります。「android:」属性は解析され、スーパークラスによって使用されます。

そのため、カスタム ビューが Android フレームワークによってどのようにインスタンス化されるか正確にはわからないため (それを宣言する XML タグに依存します)、3 つのコンストラクターを実装する必要があります。

注: 標準の Java オーバーライド スタイルを実行し、各コンストラクターに super を介してより複雑なスタイルを使用させたいと思うかもしれません。

MyView(Context context, AttributeSet attrs) {
    super(context, attrs, 0);
}

しかし、0 が常に有効なスタイルであるとは限らないため、これが問題を引き起こすのを見てきました。したがって、独自の顧客コードを実行する init() メソッドを実装し、フレームワークが顧客ビューに使用するコンストラクターのパラメーターに対応するスーパークラスのコンストラクターを呼び出すことをお勧めします。

public AnimationController(Context context) {
    super(context);
    initUI(context, null, -1);
}

public AnimationController(Context context, AttributeSet attrs) {
    super(context, attrs);
    initUI(context, attrs, -1);
}

public AnimationController(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    initUI(context, attrs, defStyle);
}

特に、3 つのパラメータを持つ super() は、API が 11 未満のデバイスには存在しない可能性があるためです。

このようにカスタム ビューを実装すると、Android ビューが使用されるのと同じように、さまざまな属性セットを使用してさまざまな XML ファイルに配置したり、一連の属性を定義するスタイルを使用したりできるため、構成可能性と再利用性が大幅に向上します。

于 2014-04-06T11:11:17.933 に答える