5

Nel mio progetto (API Target 21 con supporto AppCompat), ho bisogno di estendere la classe EditText. Il mio problema è MyEditText classe non eredita EditText stile personalizzato con:Ereditarietà stile del widget esteso

<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> 

con @color/primary verde


Screenshot:

enter image description here

  • linea 1: EditText concentrata
  • linea 2: EditText non concentrato (attivato)
  • linea 3: MyEditText non concentrato (attivato)

La mia domanda è: come posso ereditare predefinita EditText stile MyEditText?

+1

AppCompat utilizza un LayoutInflater personalizzato che sostituisce la propria implementazione EditText tint-aware quando vede un elemento EditText. Sfortunatamente questa classe non è pubblica, né sono necessarie le classi per creare il tuo testo personalizzato EditText, quindi il meglio che puoi fare adesso è presentare una richiesta di funzionalità contro appcompat sul [AOSP issue tracker] (codice https: // .google.com/p/android/issues/list) – alanv

+0

Grazie per il vostro aiuto, ho aperto un ticket https://code.google.com/p/android/issues/detail?id=80114 – alex

risposta

6

Ha un modo molto, molto, molto facile.

Invece di ereditare dal android.widget.EditText vostra abitudine EditText, ereditano questa classe e vedere se funziona:

android.support.v7.internal.widget.TintEditText 

Link alla classe: TintEditText.java

Leggi Javadoc della classe, dice:

/** 
* 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. 
*/ 

Nel tratto di questa pagina (Using Support Library APIs) ha un cautela che è: quando si utilizzano le classi dalla libreria di supporto, accertarsi di importare la classe dal pacchetto appropriato.Ad esempio, quando si applica la classe ActionBar:

  • android.support.v7.app.ActionBar quando si utilizza la libreria di supporto.
  • android.app.ActionBar durante lo sviluppo solo per livello API 11 o successivo.

Ho interpretato ciò, ovvero, se si utilizza una libreria di supporto, provare sempre a importare o ereditare il pacchetto appropriato. (Niente di meno che è scritto lol .: D)

+0

Soluzione semplice e perfetta, sicuramente la migliore per questo problema. +1 = D –

+1

Grazie per la risposta –

3

È possibile aggirare utilizzando stili

nel tema

<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> 

quindi definire il cursore

<?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> 

e drawable secondo il questo hack 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> 

Ho anche provato ad utilizzare il selettore come il campo "background", ma non ha funzionato sia con "android: state_selected" o "Android: state_activated"

Ecco un piccolo esempio

Before

After

+0

Grazie, questo è quello che ho finalmente fatto. – alex