Legen Sie einen konsistenten Stil für alle EditText fest (z.

83

Ich versuche, alle EditTextInhalte in meiner Anwendung einheitlich zu gestalten. Mir ist bewusst, dass ich so etwas tun kann:

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

Dann kann ich einen bestimmten EditTextStil dazu bringen, dies zu tun:

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

Auf diese Weise muss ich jedoch daran denken, den Stil für jeden einzelnen EditTextin meiner Anwendung individuell festzulegen, was mühsam, wenn nicht fehleranfällig ist.

Gibt es eine Möglichkeit, dies zu einem Teil eines Themas zu machen oder so? Dies ist so, dass ich diesen Stil nicht jedem zuordnen muss EditText. So etwas wie dieser fiktive Codeblock:

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

Und dann habe AndroidManifest.xmlich in meinem so etwas wie:

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

Und Voila! Alle meine EditTexthaben den konsistenten Stil, ohne dass ich den Stil für jede Instanz angeben muss.

Code Poet
quelle

Antworten:

153

Überschreiben Sie das Attribut, das auf den EditTextStil (mit dem Namen editTextStyle:) in Ihrem benutzerdefinierten Design verweist :

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

und machen Sie Ihren benutzerdefinierten Stil zu erweitern 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>

Bearbeiten:

Wenn Sie die viel neueren AppCompat-bezogenen Themen verwenden, verwenden Sie das editTextStyle-Attribut ohne das Android-Präfix:

<style name="App_Theme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="editTextStyle">@style/App_EditTextStyle</item>
</style>
Luksprog
quelle
3
Das klingt so plausibel und logisch, aber es scheint für mich nicht zu funktionieren. Könnte mir etwas fehlen?
Code Poet
1
@ ManishGupta Wie genau funktioniert das nicht? Ich habe die Stile oben getestet und sie funktionieren, ABER die layout_height/heightkönnen dort nicht eingefügt werden, da Android wahrscheinlich vor den Stilen des Themas nach diesen Attributen sucht und sich darüber beschwert, dass sie fehlen. Aber eine benutzerdefinierte Zeichen- + andere Textfarbe funktioniert mit den oben genannten.
Luksprog
Ich habe die Dinge genau so eingerichtet, wie Sie es beschreiben. Es hat keinen Sinn, wenn ich neu poste. Ich gebe dir das trotzdem. Mir fehlt irgendwo etwas. Was Sie verschreiben, ist kalte Logik und sollte funktionieren. Ich werde dies nach dem Abkühlen noch einmal überprüfen. Vielen Dank.
Code Poet
3
@ toobsco42 edittextStylegilt nicht für ein AutoCompleTextView(obwohl es ein ist EditText). Schauen Sie sich das autoCompleteTextViewStyleAttribut in der Datei theme.xml an, das auf einen Widget.AutoCompleTextViewStil in der Datei style.xml verweist .
Luksprog
3
Funktioniert auch bei mir nicht. Aber wenn ich zu wechsle <item name="android:editTextStyle">, <item name="editTextStyle">ist es in Ordnung. Vielen Dank!
Sam Sch
52

@ Luksprog Antwort ist richtig, funktioniert aber nicht für mich. Nach einigen Experimenten stellte ich fest, dass das Entfernen des Android-Namespace aus editTextStyle für mich funktioniert.

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

und machen Sie Ihren benutzerdefinierten Stil zu erweitern Widget.EditTextoder wenn Sie das AppCompat-Thema verwenden 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
quelle
1
Funktioniert auch bei mir. Aber warum verhält es sich so?
Eagle_Eye
3
Könnte etwas mit der AppCompatBibliothek zu tun haben . Erweitert sich Ihre Aktivität AppCompatActivity? Oh, die Geheimnisse der Android-Entwicklung.
Matt Zukowski
1
@MattZukowski hat basierend auf Ihrem Kommentar etwas gegraben - wahrscheinlicher Schuldiger: Ab AppCompat v7:21+jetzt müssen die Standard- Themenattribute ohne das Präfix "android:" in den Stilen verwendet werden.
iflp
Danke dafür.
Adam Varhegyi
Funktioniert auch ohne Widget.AppCompat.EditText einwandfrei. Ich kann jedoch nicht auf Widget.AppCompat.EditText zugreifen. Sagt "kann Symbol '@android: style / Widget.AppCompat.EditText' nicht auflösen"
Neri
18

Definieren Sie zunächst den Stil für Ihren EditText. Stellen Sie sicher, dass der übergeordnete Stil istandroid:Widget.EditText

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

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

Überschreiben Sie danach das Attribut android:editTextStylein Ihrem benutzerdefinierten Design. Beachten Sie, dass Sie bei Verwendung der Support-Bibliothek auch das Attribut überschreiben müssen editTextStyle(ohne den Android-Namespace).

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

Wenn Sie nur ein paar einfache Parameter wie die Textfarbe festlegen müssen, verfügt der Android-Namespace über einige Parameter, die dies tun, ohne dass ein separater Stil für den Bearbeitungstext deklariert werden muss. Z.B

<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
quelle
Für eine neuere Version von AppCompat verwenden editTextColorund entfernen android:.
Armin
-2
<style name="App_Theme" parent="@android:style/Theme.Holo">    
    <item name="android:editTextBackground">@drawable/filled_roundededges_box_dark</item>
</style>
user1700099
quelle