Встановіть послідовний стиль для всього EditText (наприклад,)


84

Я намагаюся зробити так, щоб усі EditTextмої програми мали послідовний вигляд. Я усвідомлюю, що можу зробити щось подібне:

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

Тоді я можу зробити певний EditTextстиль таким, виконавши це:

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

Але таким чином я повинен пам’ятати про те, щоб встановити стиль індивідуально для кожного EditTextв моїй програмі, що є нудним, якщо не помилковим.

Чи можна якось зробити це частиною теми чи щось інше? Це так, що мені не потрібно асоціювати цей стиль з кожним EditText. Щось на зразок цього вигаданого блоку коду:

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

І тоді в моєму AndroidManifest.xmlя маю щось на зразок:

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

І Вуаля! всі мої EditTextмають послідовний стиль, без необхідності вказувати стиль для кожного екземпляра.

Відповіді:


155

Перевизначте атрибут, що вказує на EditTextстиль (з іменем editTextStyle:)) у вашій користувацькій темі:

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

і зробіть свій власний стиль для розширення 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>

Редагувати:

Якщо ви використовуєте набагато новіші теми, пов’язані з AppCompat, використовуйте атрибут editTextStyle без префікса android:

<style name="App_Theme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="editTextStyle">@style/App_EditTextStyle</item>
</style>

3
Це звучить настільки правдоподібно та логічно, але, здається, це не працює для мене. Чи можу я чогось пропустити?
Code Poet

1
@ManishGupta Як саме не працює? Я перевірив наведені вище стилі, і вони працюють, АЛЕ layout_height/heightїх не можна вкладати туди, тому що Android, ймовірно, перевіряє ці атрибути перед стилями теми, і він скаржиться на їх відсутність. Але користувальницький малюнок + різний колір тексту працюють із вищезазначеним.
користувач

У мене все налаштовано точно так, як ви описуєте. Мені немає сенсу робити репост. Я все одно даю це тобі. Мені десь щось не вистачає. Те, що ви прописуєте, є холодною логікою і повинно працювати. Я знову перегляну це після охолодження. Дякую.
Code Poet

3
@ toobsco42 edittextStyleне застосовується до AutoCompleTextView(хоча це і є EditText). Погляньте на autoCompleteTextViewStyleатрибут у theme.xml, який вказує на Widget.AutoCompleTextViewстиль у файлі style.xml.
користувач

3
Це теж не працює у мене. Але якщо я перейду <item name="android:editTextStyle">на <item name="editTextStyle">, це нормально. Дякую!
Sam Sch

52

Відповідь @Luksprog правильна, але не працює для мене. Після деяких експериментів я виявив, що видалення простору імен android з editTextStyle змусило мене це працювати.

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

і зробіть свій власний стиль для розширення Widget.EditTextабо, якщо ви використовуєте тему 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>

1
Працює і для мене. Але чому воно поводиться так?
Eagle_Eye

3
Може мати щось спільне з AppCompatбібліотекою. Ваша діяльність поширюється AppCompatActivity? О таємниці розвитку Android.
Метт Зуковський

1
@MattZukowski зробив кілька розкопок на основі вашого коментаря - ймовірний винуватець: відтепер AppCompat v7:21+стандартні атрибути теми повинні використовуватися без префіксу "android:" у стилях.
iflp

Дякую за це.
Адам Вархеджі,

Чудово працює навіть без використання Widget.AppCompat.EditText .. Але я не можу отримати доступ до Widget.AppCompat.EditText. Каже: "Не вдається вирішити символ '@android: style / Widget.AppCompat.EditText'"
Нері,

18

Спочатку визначте стиль вашого EditText. Переконайтеся, що батьківський стиль єandroid:Widget.EditText

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

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

Після цього перевизначте атрибут android:editTextStyleу власній темі. Майте на увазі, якщо ви використовуєте бібліотеку підтримки, вам також потрібно буде замінити атрибут editTextStyle(без простору імен android).

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

1

Якщо вам просто потрібно встановити кілька простих параметрів, таких як колір тексту, у просторі імен Android є кілька параметрів, які будуть робити це без необхідності оголошувати окремий стиль для редагування тексту. Напр

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

Для нової версії AppCompat використовуйте editTextColorта видаляйте android:.
Армін

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.