以下からカスタムビューの使用について学習しています。
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);
}
最初のものは機能しないので、必要ありません。
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
}
このコードの残りの部分は この本の例 で確認できます。
これが私のパターンです(ここでカスタム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>
View
からカスタムxml
を追加する場合:
_ <com.mypack.MyView
...
/>
_
パブリックコンストラクターMyView(Context context, AttributeSet attrs),
が必要になります。そうでない場合は、Exception
がAndroid
にinflate
を試みたときに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);
}
_