Ustaw spójny styl dla całego EditText (np.)

84

Staram się, aby wszystko EditTextw mojej aplikacji miało spójny wygląd. Mam świadomość, że mogę zrobić coś takiego:

<style name="App_EditTextStyle">
    <item name="android:background">@drawable/filled_roundededges_box_dark</item>
    <item name="android:textColor">#808080</item>
    <item name="android:layout_height">45dip</item>
</style>

Następnie mogę stworzyć określony EditTextstyl, wykonując następujące czynności:

<EditText ...
    style="@style/App_EditTextStyle
    ...>

Ale w ten sposób muszę pamiętać o ustawianiu stylu indywidualnie dla każdego EditTextw mojej aplikacji, co jest żmudne, jeśli nie podatne na błędy.

Czy jest jakiś sposób, żebym mógł to uczynić częścią tematu lub czegoś takiego? Dlatego nie muszę kojarzyć tego stylu ze wszystkimi EditText. Coś takiego jak ten fikcyjny blok kodu:

<style name="App_Theme" parent="@android:style/Theme.Holo">
   ... 
   <item name="android:EditTextSyle">@style/App_EditTextStyle</item>
   ...
<style>

A potem w moim AndroidManifest.xmlmam coś takiego:

<application
    ....
    android:theme="@style/App_Theme">

I Voila! wszystkie moje EditTextmają spójny styl bez konieczności określania stylu dla każdego wystąpienia.

Code Poet
źródło

Odpowiedzi:

155

Zastąp atrybut wskazujący na EditTextstyl (o nazwie editTextStyle:)) w Twoim motywie niestandardowym:

<style name="App_Theme" parent="@android:style/Theme.Holo">
   <item name="android:editTextStyle">@style/App_EditTextStyle</item>
</style>

i przedłuż swój niestandardowy styl Widget.EditText:

<style name="App_EditTextStyle" parent="@android:style/Widget.EditText">
    <item name="android:background">@drawable/filled_roundededges_box_dark</item>
    <item name="android:textColor">#808080</item>
    <item name="android:layout_height">45dip</item>
</style>

Edytować:

Jeśli używasz znacznie nowszych motywów związanych z AppCompat, użyj atrybutu editTextStyle bez prefiksu Androida:

<style name="App_Theme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="editTextStyle">@style/App_EditTextStyle</item>
</style>
użytkownik
źródło
3
Brzmi to tak wiarygodnie i logicznie, ale wydaje mi się, że nie działa. Czy mogłem coś przeoczyć?
Code Poet
1
@ManishGupta Jak dokładnie nie działa? Przetestowałem powyższe style i działają, ALE layout_height/heightnie można ich tam umieścić, ponieważ Android prawdopodobnie sprawdza te atrybuty przed stylami motywu i będzie narzekać, że ich brakuje. Ale niestandardowe rysowanie + inny kolor tekstu działa z powyższym.
użytkownik
Mam wszystko ustawione dokładnie tak, jak opisujesz. Nie ma sensu, żebym publikował ponownie. I tak ci to daję. Gdzieś brakuje mi czegoś. To, co przepisujesz, to zimna logika i powinno działać. Wrócę do tego po ochłodzeniu. Dzięki.
Code Poet
3
@ toobsco42 edittextStylenie ma zastosowania do AutoCompleTextView(chociaż jest EditText). Spójrz na autoCompleteTextViewStyleatrybut w pliku theme.xml, który wskazuje na Widget.AutoCompleTextViewstyl w pliku style.xml.
użytkownik
3
Na mnie też nie działa. Ale jeśli zmienię się <item name="android:editTextStyle">na <item name="editTextStyle">, wszystko jest w porządku. Dzięki!
Sam Sch
52

@Luksprog odpowiedź jest poprawna, ale nie działa dla mnie. Po kilku eksperymentach odkryłem, że usunięcie przestrzeni nazw Androida z editTextStyle sprawiło, że zadziałało.

<style name="App_Theme" parent="@android:style/Theme.Holo">
   <item name="editTextStyle">@style/App_EditTextStyle</item>
</style>

i Widget.EditTextspraw, aby Twój niestandardowy styl został rozszerzony lub jeśli używasz motywu AppCompat Widget.AppCompat.EditText:

<style name="App_EditTextStyle" parent="@android:style/Widget.EditText">
    <item name="android:background">@drawable/filled_roundededges_box_dark</item>
    <item name="android:textColor">#808080</item>
    <item name="android:layout_height">45dip</item>
</style>
iflp
źródło
1
U mnie też działa. Ale dlaczego tak się zachowuje?
Eagle_Eye,
3
Może mieć coś wspólnego z AppCompatbiblioteką. Czy Twoja działalność się wydłuża AppCompatActivity? Och, tajemnice rozwoju Androida.
Matt Zukowski
1
@MattZukowski trochę poszperał w oparciu o Twój komentarz - prawdopodobny winowajca: od AppCompat v7:21+początku standardowe atrybuty motywu muszą być używane bez przedrostka „android:” w stylach.
iflp
Dziękuję za to.
Adam Varhegyi,
Działa dobrze nawet bez użycia Widget.AppCompat.EditText .. Ale nie mam dostępu do Widget.AppCompat.EditText. Mówi „nie można rozwiązać symbolu '@android: style / Widget.AppCompat.EditText'”
Neri
18

Najpierw zdefiniuj styl dla swojego EditText. Upewnij się, że styl nadrzędny toandroid:Widget.EditText

<style name="CustomEditTextStyle" parent="android:Widget.EditText">

    <item name="android:textColor">#0F0F0F</item>
    <!-- ... More items here if needed ... -->
</style>

Następnie zastąp atrybut android:editTextStylew kompozycji niestandardowej. Należy pamiętać, że jeśli korzystasz z biblioteki obsługi, musisz również zastąpić atrybut editTextStyle(bez przestrzeni nazw Androida).

<style name="App_Theme" parent="...">
   <item name="android:editTextStyle">@style/CustomEditTextStyle</item>
   <item name="editTextStyle">@style/CustomEditTextStyle</item> <!-- For compatibility with the support library -->
</style>
Reynaldo Aguilar
źródło
1

Jeśli potrzebujesz tylko ustawić kilka prostych parametrów, takich jak kolor tekstu, przestrzeń nazw Androida ma kilka parametrów, które zrobią to bez konieczności deklarowania oddzielnego stylu dla tekstu edycji. Na przykład

<style name="MyStyle" parent="android:Theme.Material.NoActionBar">
    <item name="colorPrimary">@color/black</item>
    <item name="colorPrimaryDark">@color/white</item>
    <item name="colorAccent">@color/white</item>
    <item name="android:textColor">@color/black</item>
    <item name="android:editTextColor">@color/black</item>
    <item name="android:editTextBackground">@color/black</item>
    ....
</style>
Phil Blandford
źródło
W przypadku nowszej wersji AppCompat użyj editTextColori usuń android:.
Armin
-2
<style name="App_Theme" parent="@android:style/Theme.Holo">    
    <item name="android:editTextBackground">@drawable/filled_roundededges_box_dark</item>
</style>
user1700099
źródło