2016-12-20 3 views
0

Что такое правильный способ расширения EditText?Каков правильный способ создания пользовательского представления на основе EditText?

Проблема заключается в следующем:

У меня есть пустое приложение из шаблона с двумя EditText:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <EditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:hint="one"/> 

    <EditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:hint="two"/> 
</LinearLayout> 

Он работает отлично:

enter image description here

Затем я создаю свой собственный вид из EditText:

public class CuteEditText extends EditText { 
    public CuteEditText(Context context) { 
     this(context, null); 
    } 

    public CuteEditText(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public CuteEditText(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     // some special initialization will be here 
    } 
} 

И когда я изменяю EditText к моему CuteEditText, интерфейс работает неправильно:

enter image description here

Проблема не только с видом Ot UI. Если я напечатаю что-то в первом EditText, а затем коснувшись второго, произойдет nohing: вход будет продолжен первым.

Такое же поведение, если я наследую CuteEditText из AppCompatEditText.

Что не так?

Источники для эксперимента доступны в https://github.com/tseglevskiy/EditTextExperiment

+2

вы должны пройти 'android.R.attr.editTextStyle' (вместо '0') в качестве последнего параметра' этого (контекст, ATTRS, 0); 'или просто позвонить' super' во всех ваши конструкторы – pskink

ответ

0

Ваши construtors сломаны. Вот как это должно выглядеть:

public class CuteEditText extends EditText { 
    public CuteEditText(Context context) { 
     super(context); 
    } 

    public CuteEditText(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public CuteEditText(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 
} 
+0

Они действительно не сломаны, как таковые. Это просто, что '0' не является правильным значением для' defStyleAttr', когда их связывают. –

+0

Они сломаны для того, что хочет OP:). – Kuno

+0

Да, параметр EditText по умолчанию defStyleAttr не равен 0. Спасибо. – tse

0

Вам не нужна третья перегрузка конструктора. Первый - для создания представления программно, а второй для создания представления из xml. Этих двух должно быть достаточно для большинства случаев.

public class CuteEditText extends EditText { 
    public CuteEditText(Context context) { 
     this(context, null); 
    } 

    public CuteEditText(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 
} 
Смежные вопросы