Вопрос

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

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

Видеть это

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top