Android Custom View Constructor

Я узнаю об использовании пользовательских представлений из следующего:

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); } 

Solutions Collecting From Web of "Android Custom View Constructor"

Вам не нужен первый, так как это просто не сработает.

Третий будет означать, что ваш пользовательский View будет использоваться из файлов макета XML. Если вас это не волнует, вам это не нужно.

Четвертый – это просто неправильно, AFAIK. Нет конструктора View который принимает Map в качестве третьего параметра. Есть один, который принимает значение int в качестве третьего параметра, используемого для переопределения стиля по умолчанию для виджета.

Я использую this() синтаксис 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 а также указываете attribute android:style например:

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

Вам также понадобится третий публичный конструктор MyView(Context context, AttributeSet attrs,int defStyle) .

Третий конструктор обычно используется, когда вы расширяете стиль и настраиваете его, а затем вы хотите установить этот 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); } 

Видеть это