5

Это ошибка, которую я обнаружил при работе над настоящим приложением, но я создал пустой проект, чтобы воспроизвести его.Детский класс EditText выглядит иначе, чем обычный EditText на Android 4

У меня есть следующий макет:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
    android:id="@+id/root" 
    android:orientation="vertical" 
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> 

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

    <com.example.test.testapp.MyEditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 


</LinearLayout> 

Класс MyEditText выглядит следующим образом:

public class MyEditText extends EditText { 

    public MyEditText(Context context){ 
     super(context); 
    } 

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


    public MyEditText(Context context, AttributeSet attrs, int defStyle){ 
     super(context, attrs, defStyle); 
    } 


} 

Мой styles.xml файл пуст за тему, кроме

<resources> 

    <!-- Base application theme. --> 
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
     <!-- Customize your theme here. --> 
    </style> 

</resources> 

Я хотел бы ожидать MyEditText выглядеть нормально EditText, и он работает на Android 5.0, но не на Android 2.3.7, Android 4.1.3 или Android 4.4.4.

На этих Android версий EditText s отличается по цвету, нормальный один имеет подчеркивание голубого цвета при фокусировке, обычай один имеет черное подчеркивание:

enter image description here

enter image description here

Почему этот и как я могу это предотвратить?

EDIT/UPDATE:

Google seems to have adressed this в библиотеку поддержки путем введения, среди прочего, класс AppCompatEditText.

ответ

6

Почему это происходит

Поскольку вы используете AppCompat. Цитирование the blog post on the subject:

Q: Почему мой EditText (или другой виджет, перечисленных выше) не правильно тонированное на моем предварительно Lollipop устройстве?

A: Виджет, тонизирующий в AppCompat, работает, перехватывая любую инфляцию макета и вставляя специальную версию виджета на свое место. Для большинства людей это будет работать нормально, но я могу думать о нескольких сценариях, где это не будет работать, в том числе:

  • У вас есть свой собственный вариант виджета (то есть вы расширенный EditText)
  • Вы создаете EditText без LayoutInflater (т. Е. Вызываете новый EditText()).

Таким образом, поведение ожидается. В backportport AppCompat предусмотрена легкая обратная передача тонировки, но она не будет обрабатывать все случаи.

как я могу предотвратить его?

экспромтом, либо:

  • Не создать подкласс EditText или

  • При работе на AppCompat, искать оттенок и выяснить, как применять его самостоятельно , возможно, изучив исходный код AppCompat (при условии, что он доступен - я его не искал), или

  • Не используйте AppCompat и посмотрите, работает ли тонирование как Ожидается, используя Theme.Material на Android 5.0 и выше устройств

Вполне возможно, что в будущем AppCompat может обеспечить какую-то систему для подклассов участвовать в процессе тонирования. И могут быть другие решения, чем эти - вот что приходит на ум.

+0

Вау, у вас уже есть этот ответ? :) Огромное спасибо! – FWeigl

+0

@Ascorbin: «Ого, у вас уже был подготовлен этот ответ?» - Ну, это половина цитаты, которая экономит на печатании. :-) Мне нужно в какой-то момент взглянуть на мой второй вариант, поскольку у меня есть [подкласс «EditText'» (https://github.com/commonsguy/cwac-richedit), который будет страдать от того же проблема. – CommonsWare

5

Фактически вывод, достигнутый в этом принятом ответе, здесь не совсем прав (больше). You СЛЕДУЕТ использовать AppCompat, но просто нужно понимать, что AppCompat заменит ваш EditText AppCompatEditText во время инфляции макета. Тот же процесс происходит и с несколькими другими элементами интерфейса, такими как Switch, CheckBoxes и т. Д. Google сделал это так, чтобы они могли продвигать Material design look-n-feel настолько же широко и с минимальными изменениями кода у пользователей.

Если вы хотите подкласс EditText, вы должны подклассифицировать AppCompatEditText (android.support.v7.widget.AppCompatEditText).

Смежные вопросы