Подтвердить что ты не робот

Конструктор пользовательского вида 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);
} 
4b9b3361

Ответ 1

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

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

Четвертый - это просто неправильно, AFAIK. Нет конструктора 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
}

Вы можете увидеть остальную часть этого кода в в этом примере книги.

Ответ 2

Вот мой шаблон (создание пользовательского 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>

Ответ 3

Когда вы добавляете свой пользовательский 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);
    }

Смотрите это