web-dev-qa-db-ja.com

Androidカスタムビューコンストラクタ

以下からカスタムビューの使用について学習しています。

http://developer.Android.com/guide/topics/ui/custom-components.html#modifying

説明は言う:

クラスの初期化いつものように、スーパーが最初に呼び出されます。さらに、これはデフォルトのコンストラクターではなく、パラメーター化されたコンストラクターです。 EditTextは、XMLレイアウトファイルからインフレートされたときにこれらのパラメーターを使用して作成されるため、コンストラクターはそれらを取得し、スーパークラスコンストラクターにも渡す必要があります。

より良い説明はありますか?私はコンストラクタがどのように見えるべきかを理解しようと試みており、4つの可能な選択肢を考え出しました(投稿の最後の例を参照)。これらの4つの選択肢が何を行う(または行わない)か、なぜそれらを実装する必要があるのか​​、またはパラメーターの意味がわかりません。これらの説明はありますか?

public MyCustomView()
{
    super();
}

public MyCustomView(Context context)
{
    super(context);
}

public MyCustomView(Context context, AttributeSet attrs)
{
    super(context, attrs);
} 

public MyCustomView(Context context, AttributeSet attrs, Map params)
{
    super(context, attrs, params);
} 
34
Mitch

最初のものは機能しないので、必要ありません。

3番目は、カスタムViewがXMLレイアウトファイルから使用できることを意味します。あなたがそれを気にしないなら、あなたはそれを必要としません。

4つ目は間違いです、AFAIK。 3番目のパラメーターとしてViewを使用するMapコンストラクターはありません。ウィジェットのデフォルトスタイルをオーバーライドするために使用される3番目のパラメーターとしてintを取るものがあります。

私はthis()構文を使用してこれらを組み合わせる傾向があります:

public ColorMixer(Context context) {
    this(context, null);
}

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

public ColorMixer(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    // real work here
}

このコードの残りの部分は この本の例 で確認できます。

66
CommonsWare

これが私のパターンです(ここでカスタムViewGoupを作成していますが、それでも):

// CustomView.Java

public class CustomView extends LinearLayout {

    public CustomView(Context context) {
        super(context);
        init(context);
    }

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

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

    private void init(Context ctx) {
        LayoutInflater.from(ctx).inflate(R.layout.view_custom, this, true);
            // extra init
    }

}

そして

// view_custom.xml

<merge xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <!-- Views -->
</merge>
11
yanchenko

Viewからカスタムxmlを追加する場合:

_ <com.mypack.MyView
      ...
      />
_

パブリックコンストラクターMyView(Context context, AttributeSet attrs),が必要になります。そうでない場合は、ExceptionAndroidinflateを試みたときにViewを取得します。

そして、Viewからxmlを追加し、さらにspecify_Android:style_ attribute likeを追加した場合:

_ <com.mypack.MyView
      style="@styles/MyCustomStyle"
      ...
      />
_

また、3番目のpublicコンストラクタMyView(Context context, AttributeSet attrs,int defStyle)も必要になります。

3番目のコンストラクターは通常、スタイルを拡張してカスタマイズし、レイアウトでstyleを特定のViewに設定する場合に使用されます

詳細を編集

_public MyView(Context context, AttributeSet attrs) {
            //Called by Android if <com.mypack.MyView/> is in layout xml file without style attribute.
            //So we need to call MyView(Context context, AttributeSet attrs, int defStyle) 
            // with R.attr.customViewStyle. Thus R.attr.customViewStyle is default style for MyView.
            this(context, attrs, R.attr.customViewStyle);
    }
_

これを参照

7
Jawad Zeb