Android пользовательский вид конструктора
-
04-10-2019 - |
Вопрос
Я узнаю об пользовательских представлениях из следующего:
http://developer.android.com/guide/topics/ui/custom-components.html#Modify
Описание говорит:
Учебная инициализация как всегда, супер называется первым. Кроме того, это не конструктор по умолчанию, а параметризованный. EditText создан с этими параметрами, когда он накачивается из файла макета XML, таким образом, наш конструктор должен использовать их, и пропустить их в конструктор SuperClass.
Есть ли лучшее описание? Я пытался выяснить, как должен выглядеть конструктор (ы), и я придумал 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);
}
Решение
Вам не нужен первый, как это просто не будет работать.
Третий будет означать ваш обычай View
будет использоваться из файлов макета XML. Если вам все равно, вам это не нужно.
Четвертый просто не прав, афайк. Здесь нет View
конструктор, который принимает Map
как третий параметр. Есть тот, который берет 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
а также уточнить то android:style
attribute
подобно :
<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);
}