2011-11-13 13 views
19

私は自分のカスタムビューをViewから拡張しました。私の活動からビュー用に呼び出されるコンストラクタはどれですか?

  1. View(Context context, AttributeSet attrs, int defStyle)
  2. View(Context context, AttributeSet attrs)
  3. View(Context context)

私はstd.setContentView(R.layout.main)を呼び出す:3つのビューのコンストラクタがあります。 2番目のコンストラクタが呼び出されています。なぜ2番目のもの?どの人が呼び出されるのか、そしてなぜそれを知るのか?ビューのドキュメントの下でのAndroid開発者サイトから

答えて

41

:コードからビューを作成するときに使用する

public View (Context context)

シンプルなコンストラクタ。

このコンストラクタは、Javaでビューを作成するために使用できるものです。 XMLから膨らませるときは呼び出されません。

public View (Context context, AttributeSet attrs)

XMLからの眺めを膨張させたときに呼び出されるコンストラクタ。これは、ビューがXMLファイルから構築され、XMLファイルで指定された属性を提供するときに呼び出されます。このバージョンではデフォルトのスタイル0が使用されるため、適用される唯一の属性値は、コンテキストのテーマと指定されたAttributeSetの値です。

onFinishInflate()メソッドは、すべての子が追加された後に呼び出されます。

したがって、スタイルを指定しないときにXMLからビューを展開すると、このコンストラクタが呼び出されます。

public View (Context context, AttributeSet attrs, int defStyle)

XMLからインフレを実行し、クラス固有の基本スタイルを適用します。 Viewのこのコンストラクタでは、サブクラスが膨張しているときにサブクラスが独自の基本スタイルを使用できます。たとえば、Buttonクラスのコンストラクタはこのバージョンのスーパークラスコンストラクタを呼び出し、defStyleにR.attr.buttonStyleを指定します。これにより、テーマのボタンスタイルで基本ビューのすべての属性(特に背景)とButtonクラスの属性を変更することができます。

あなたはこれらのコンストラクタのすべてを実装する必要がありますが、あなたは、それぞれ、最初の二つのためthis(context, null)this(context, attrs, 0)を呼び出すことによって、三番目に作業のすべてを置くことができます。

+2

super(context、attrs)とsuper(context、attrs、0)は私のために差別的に機能します。最初のものは大丈夫ですが、2番目のビューは元のスタイルをビューから削除するので、私はこれを使うことができません(context、attrs、0)。 Androidの新しいバージョンではバグですか? – broot

+1

コンストラクタ呼び出しをカスケードしないでください。以下の私の答えを見てください。 – Jin

+0

私はこれがJinの答えだと思います:http://stackoverflow.com/a/34301725/326874 – aeracode

関連する問題