5

W moim projekcie (docelowy interfejs API 21 z obsługą AppCompat) muszę rozszerzyć klasę EditText. Mój problem jest MyEditText klasa nie dziedziczy EditText styl dostosowane z:Dziedziczenie stylu rozszerzonego Widget

<style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar" > 
    <item name="colorPrimary">@color/primary</item> 
    <item name="colorControlNormal">@color/grey_light</item> 
    <item name="colorControlActivated">@color/primary</item> 
    <item name="colorControlHighlight">@color/primary</item> 
</style> 

z @color/primary zielony


Zrzut ekranu:

enter image description here

  • linia 1: EditText koncentruje
  • linia 2: EditText nie koncentruje się (włączone)
  • linia 3: MyEditText nie koncentruje się (włączone)

Moje pytanie brzmi: Jak mogę odziedziczyć domyślny EditText styl MyEditText?

+1

AppCompat używa niestandardowej zmiennej LayoutInflater, która zastępuje własną edycję EditText uwzględniającą odcienie, gdy widzi element EditText. Niestety, ta klasa nie jest publiczna, podobnie jak klasy potrzebne do stworzenia własnego edytowalnego tekstu EditText, więc najlepsze, co możesz teraz zrobić, to złożyć wniosek o funkcję przeciwko appcompat w [trackerze problemów AOSP] (https: // code .google.com/p/android/issues/list) – alanv

+0

Dziękuję za pomoc, otworzyłem bilet https://code.google.com/p/android/issues/detail?id=80114 – alex

Odpowiedz

6

Ma sposób bardzo, bardzo, bardzo łatwy.

Zamiast dziedziczenie z android.widget.EditText niestandardowego EditText, dziedziczą tej klasy i sprawdzić, czy to działa:

android.support.v7.internal.widget.TintEditText 

Link do tej klasy: TintEditText.java

zapoznać się Javadoc klasy, mówi:

/** 
* An tint aware {@link android.widget.EditText}. 
* <p> 
* This will automatically be used when you use {@link android.widget.EditText} in your 
* layouts. You should only need to manually use this class when writing custom views. 
*/ 

W odcinku tej stronie (Using Support Library APIs) ma ostrożność, który jest: Podczas korzystania z klas z biblioteki pomocniczej, upewnij się, że importujesz klasę z odpowiedniego pakietu.Na przykład podczas stosowania klasy ActionBar:

  • android.support.v7.app.ActionBar podczas korzystania z biblioteki pomocy technicznej.
  • android.app.ActionBar podczas rozwijania tylko dla poziomu interfejsu API 11 lub wyższego.

Zinterpretowałem to, tzn. Jeśli korzystasz z biblioteki wsparcia, zawsze staraj się importować lub dziedziczyć odpowiedni pakiet. (Nic mniej niż to jest napisane: D)

+0

Rozwiązanie proste i doskonałe, na pewno najlepsze dla tego problemu. +1 = D –

+1

Dzięki za odpowiedź –

3

można obejść przy użyciu stylów

W motywu

<style name="AppTheme.BaseNoActionBar" parent="Theme.AppCompat.Light"> 
    <item name="android:editTextStyle">@style/Widget.EditText</item> 
</style> 


<!-- EditText style --> 
<style name="Widget.EditText" parent="Widget.AppCompat.EditText"> 
    <item name="android:textCursorDrawable">@drawable/cursor_gray</item> 
    <item name="android:background">@drawable/underline_gray</item> 
</style> 

następnie zdefiniować kursor

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" > 
    <size android:width="1dp" /> 
    <solid android:color="@color/lightGrayLabel" /> 
</shape> 

i odkształcalne według tego włamywanie https://stackoverflow.com/a/20891131

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:top="-6dp" android:left="-6dp" android:right="-6dp"> 
     <shape android:shape="rectangle"> 
      <solid android:color="@android:color/transparent"/> 
      <stroke android:color="@color/lightGrayLabel" android:width="3dp"/> 
     </shape> 
    </item> 
</layer-list> 

Próbowałem również przy użyciu wybieraka jako pole „czerwony”, ale to nie działa albo „android: state_selected” lub „android: state_activated”

Oto mały przykład

Before

After

+0

Dziękuję, to w końcu to zrobiłem. – alex