Używam appcompat v7, aby uzyskać spójny wygląd na Androidzie 5 i mniejszych. Działa raczej dobrze. Jednak nie mogę wymyślić, jak zmienić kolor dolnej linii i kolor akcentu dla EditTexts. Czy to możliwe?
Próbowałem zdefiniować niestandardowy android:editTextStyle
(patrz poniżej), ale udało mi się jedynie zmienić pełny kolor tła lub kolor tekstu, ale nie dolną linię ani kolor akcentu. Czy można zastosować określoną wartość właściwości? czy muszę używać niestandardowego obrazu do rysowania za pośrednictwem android:background
właściwości? czy nie jest możliwe określenie koloru w heksie?
<style name="Theme.App.Base" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:editTextStyle">@style/Widget.App.EditText</item>
</style>
<style name="Widget.App.EditText" parent="Widget.AppCompat.EditText">
???
</style>
Według źródeł Android API 21 wydaje się, że EditText z materiałowym designem używa colorControlActivated
i colorControlNormal
. Dlatego próbowałem zastąpić te właściwości w poprzedniej definicji stylu, ale nie ma to żadnego efektu. Prawdopodobnie appcompat go nie używa. Niestety nie mogę znaleźć źródeł dla ostatniej wersji appcompat z materiałowym designem.
AppCompatEditText
Najwyraźniej musiałem przedłużyć .Odpowiedzi:
Wreszcie znalazłem rozwiązanie. To po prostu składa się z nadrzędnych wartości dla
colorControlActivated
,colorControlHighlight
orazcolorControlNormal
w definicji app motywu i nie swoim stylu EditText. Następnie pomyśl, aby użyć tego motywu do dowolnej aktywności. Poniżej znajduje się przykład:źródło
android:theme="@style/Theme.App.Base
. Zapewni to, że styl nie wpłynie również na inne widoki w twoich układach, których nie chcesz zmieniać.AppCompatActivity
. Nie będzie działać, jeśli odziedziczy po nimActivity
.Czułem, że potrzebuję odpowiedzi na wypadek, gdyby ktoś chciał zmienić tylko jeden tekst edycji. Robię to tak:
źródło
Choć rozwiązanie Laurents jest poprawna, to przychodzi z pewnymi niedogodnościami, jak opisane w komentarzach, ponieważ nie tylko w dolnym wierszu
EditText
zostanie przyciemnione ale z tyłu guzikToolbar
,CheckBoxes
itd., Jak również.Na szczęście
v22.1
odappcompat-v7
wprowadzono kilka nowych możliwości. Teraz możliwe jest przypisanie określonego motywu tylko do jednego widoku. Prosto z listy zmian :Zamiast ustawiać pożądany kolor w motywie globalnym, tworzymy nowy i przypisujemy go tylko do
EditText
.Przykład:
źródło
colorControlNormal
bez prefiksu Androida używa metody appcompat do przyciemniania widżetów, natomiast z prefiksem wraca do metody systemowej i jest to dostępne tylko w urządzeniach API 21+.22.2.0
wersji AppCompat, ale ta sztuczka nie działa :(Można to zmienić w XML, używając:
W przypadku referencyjnego interfejsu API> = 21 użyj:
W przypadku kompatybilności wstecznej API <21 użyj:
źródło
backgroundTint="@color/blue"
zamiastandroid:backgroundTint="@color/blue"
wsparcia wstecznegoandroid:backgroundTint="@color/blue"
, służyapp:backgroundTint="@color/blue"
do obsługi urządzeń sprzed wersji Lollipop, dzięki za komentarz!tools:ignore="MissingPrefix"
jeśli czerwony podkreślenie pop popapp:backgroundTint="<your color>"
Oto rozwiązanie dla API <21 i nowszych
Mam nadzieję, że to pomoże
źródło
24.2.1
,25.1.1
,25.2.0
dla urządzenia <21 i> 21 i nadal pracuje. Sprawdź tę prostą wersję demonstracyjną drive.google.com/file/d/0B_poNaia6t8kSzU3bDFVazRSSDA/… . Nie wiem, dlaczego ten kod nie działa dla Ciebie, więc daj mi znać. dziękujęAkceptowana odpowiedź jest nieco bardziej zależna od stylu, ale najbardziej wydajne jest dodanie atrybutu colorAccent w stylu AppTheme w następujący sposób:
Atrybut colorAccent służy do barwienia widgetów w aplikacji i dlatego powinien być stosowany dla zachowania spójności
źródło
name="android:colorAccent"
omyłkowoJeśli używasz
appcompat-v7:22.1.0+
, możesz użyć DrawableCompat, aby zabarwić widżetyźródło
Posługiwać się:
Będzie to obsługiwać urządzenia sprzed wersji Lollipop nie tylko +21
źródło
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
i powinno działaćźródło
Jednym z szybkich rozwiązań Twojego problemu jest zajrzenie do twojego pakietu aplikacji / build / intermediates / exploded-aar / com.android.support / appcompat-v7 / res / drawable / for abc_edit_text_material.xml i skopiuj ten plik xml do folderu, który można wyciągnąć. Następnie możesz zmienić kolor 9 plików łatek z tego selektora, aby dopasować go do swoich preferencji.
źródło
To bardzo proste, po prostu dodaj
android:backgroundTint
atrybut do swojegoEditText
.źródło
app:backgroundTint="@color/blue"
działa na wszystkich poziomach interfejsu API .. chociaż z jakiegokolwiek powodu nadal zmienia kolor na inny po wybraniu XDOto część kodu źródłowego
TextInputLayout
biblioteki obsługi projektu ( ZAKTUALIZOWANA dla wersji 23.2.0 ), która zmieniaEditText
kolor dolnej linii w prostszy sposób:Wygląda na to, że cały powyższy kod staje się bezużyteczny w 23.2.0, jeśli chcesz zmienić kolor programowo.
A jeśli chcesz obsługiwać wszystkie platformy, oto moja metoda:
źródło
Ja też zbyt długo tkwiłem w tym problemie.
Potrzebowałem rozwiązania, które działało dla wersji zarówno powyżej, jak i poniżej v21.
W końcu odkryłem bardzo proste, być może nie idealne, ale skuteczne rozwiązanie: po prostu ustaw kolor tła
transparent
we właściwościach EditText.Mam nadzieję, że to pozwoli komuś zaoszczędzić trochę czasu.
źródło
Dla mnie zmodyfikowałem zarówno AppTheme, jak i wartość colors.xml Zarówno colorControlNormal, jak i colorAccent pomogły mi zmienić kolor obramowania EditText. Oprócz kursora i „|” gdy znajduje się w EditText.
Oto colors.xml
Wyjąłem atrybut android: textCursorDrawable do @null, który umieściłem w stylu editText. Gdy spróbowałem tego użyć, kolory nie zmieniły się.
źródło
Aby to zrobić, możesz ustawić tło tekstu edycyjnego na prostokąt z dopełnieniem minus po lewej, prawej i górze. Oto przykład xml:
Zastąp kształt selektorem, jeśli chcesz ustawić inną szerokość i kolor dla zogniskowanego tekstu edycyjnego.
źródło
W Activit.XML dodaj kod
Gdzie
BackgroundTint=color
dla pożądanego koloruźródło
Używam tej metody, aby zmienić kolor linii za pomocą PorterDuff, bez innych rysunków.
źródło
Jeśli chcesz zmienić dolną linię bez używania kolorów aplikacji, użyj tych linii w swoim motywie:
Nie znam innego rozwiązania.
źródło
Opracowałem działające rozwiązanie tego problemu po 2 dniach zmagań, poniższe rozwiązanie jest idealne dla tych, którzy chcą zmienić tylko kilka edycji tekstu, zmienić / przełączyć kolor za pomocą kodu Java i chcą rozwiązać problemy z różnymi zachowaniami w wersjach systemu operacyjnego ze względu na użycie metody setColorFilter ().
Używa w xml
Dodaj stylowo linie
kod Java, aby przełączyć kolor
źródło
Byłem całkowicie zaskoczony tym problemem. Próbowałem wszystkiego w tym wątku i innych, ale bez względu na to, co zrobiłem, nie mogłem zmienić koloru podkreślenia na nic innego niż domyślny niebieski.
W końcu zorientowałem się, co się dzieje.
android.widget.EditText
Używałem (niepoprawnie) podczas tworzenia nowej instancji (ale reszta moich komponentów pochodziła z biblioteki appcompat). Powinienem był użyćandroid.support.v7.widget.AppCompatEditText
. Wymieniłemnew EditText(this)
znew AppCompatEditText(this)
i problem został rozwiązany natychmiast. Okazuje się, że jeśli faktycznie używaszAppCompatEditText
, będzie po prostu szanowałaccentColor
twój motyw (jak wspomniano w kilku komentarzach powyżej) i nie jest wymagana dodatkowa konfiguracja.źródło
Jest to najłatwiejszy i najbardziej wydajny / wielokrotnego użytku / działa na wszystkich interfejsach API
Utwórz niestandardową klasę EditText w następujący sposób:
Następnie użyj tego w następujący sposób:
źródło
Aby dynamicznie zmienić tło EditText , możesz użyć ColorStateList .
Kredyty: Ta SO odpowiedź na temat ColorStateList jest niesamowita .
źródło
Dodaj
app:backgroundTint
poniżej poziomu interfejsu API 21. W przeciwnym razie użyjandroid:backgroundTint
.Dla poziomu poniżej interfejsu API 21.
Dla poziomu wyższego niż api 21.
źródło
Zmodyfikuj tę metodę zgodnie z potrzebami. To zadziałało dla mnie!
źródło