Установите согласованную тему для всех editTexts в Android

Я закончил создание своего приложения. Теперь я хочу сбросить все мои editTexts, чтобы ширина макета была родительской для заполнения, а не обертывалась.

android:layout_width="fill_parent"

в то время как в настоящее время все мои editTexts

android:layout_width="wrap_content"

Есть ли способ сделать это в XML-файле стиля, а не индивидуально в каждом макете? В настоящее время это мой файл styles.xml

<style name="AppTheme" parent="android:Theme.Light">  
    <item name="android:fontFamily">Verdana</item>
    <item name="android:editTextStyle">@style/EditTextStyle</item>
</style>

<style name="EditTextStyle" parent="@android:style/Widget.EditText">
    <item name="android:layout_width">fill_parent</item>
    <item name="android:textColor">#808080</item>
</style>

Но я получаю исключение, в котором говорится, что необходимо указать layout_width. Это мое исключение:

07-15 11:13:34.872: E/AndroidRuntime(1195): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.passwordkeeper.ui/com.passwordkeeper.ui.ActivityLogin}: java.lang.RuntimeException: Binary XML file line #29: You must supply a layout_width attribute.

Любой простой выход или мне нужно изменить атрибут во всех моих editText по отдельности?


person Randomly Named User    schedule 15.07.2013    source источник
comment
Вы проверили, установили ли вы AppTheme в качестве темы в файле манифеста?   -  person Naresh    schedule 15.07.2013
comment
Ага Нареш ... Тема настроена правильно.   -  person Randomly Named User    schedule 15.07.2013
comment
Просто удалите layout_width из стиля и попробуйте. Мы не можем установить этот атрибут в стиле. Попробуйте заново запустить и проверьте, работает ли!   -  person Naresh    schedule 15.07.2013
comment
Выдает ту же ошибку ... в нем написано, что нужно указать layout_width.   -  person Randomly Named User    schedule 15.07.2013


Ответы (7)


Вы можете попробовать это. Вот часть файла манифеста, которую необходимо изменить для вызова настраиваемой темы (настраиваемая тема, которая называется здесь, называется AppTheme:

<application android:name="YourApplication"
android:theme="@style/AppTheme" >

Затем в своем файле styles.xml создайте и настройте эту настраиваемую тему:

<style name="AppTheme" parent="@android:style/Theme.Holo.Light">
 <item name="android:typeface">YourTypeFace</item>
</style>

Вы можете добавить нужные вам параметры внутри стиля. Это применит стиль ко всем вашим текстовым представлениям.

person Traxex1909    schedule 15.07.2013

Одно из решений вашей проблемы - применить настраиваемую тему ко всем вашим действиям. Для этого вы можете наследовать свойства существующей темы и переопределить свойства, которые вы хотите изменить.

  1. В AndroidManifest.xml найдите элемент .
  2. Добавьте к нему атрибут:

android: theme = "@ style /"

  1. Найдите файл styles.xml в папке значений.
  2. Используйте следующий шаблон:
<style name="ApplicationStyle" parent="android:Theme.Light">
    <item name="@android:editTextStyle">@style/customEditText</item>"
</style>

Имена, использованные выше, являются лишь примерами, вы можете использовать свои собственные. Что касается родительской темы, это тоже зависит от вас.

Все, что осталось, - это определение editTextStyle (или любое другое имя, которое вы выбрали для стиля). Вы должны унаследовать свойства от Widget.EditText и переопределить свойства, которые вы хотите изменить, например следующие:

<style name="customEditText" parent="@android:style/Widget.EditText">
    <item name="android:textColor" >#ffffff</item>
</style>

Цитата из официального руководства по Android:

Атрибут parent в элементе является необязательным и указывает идентификатор ресурса другого стиля, от которого этот стиль должен наследовать свойства. Затем вы можете переопределить унаследованные свойства стиля, если хотите.

Я постарался сделать его понятным и понятным. Я младший разработчик, поэтому, хотя приведенное выше решение работает для меня, оно может быть не лучшим. Как я уже сказал, это решает проблему довольно эффективно.

person Mariusz    schedule 10.05.2014

К сожалению, невозможно установить атрибуты макета (layout_ *) из темы (см. документация по параметрам макета и этот ответ от Инженер по фреймворку Android). Вы должны установить их для каждого элемента или установить атрибуты макета в стиле и позволить каждому элементу ссылаться на стиль следующим образом:

<Button style="@style/ButtonBig" android:text="my text" />

где ButtonBig определяется следующим образом:

<style name="ButtonBig" parent="android:Widget.Holo.Light.Button">
    <item name="android:textSize">20sp</item>
    <item name="android:layout_width">match_parent</item>
    <item name="android:layout_height">100dp</item>        
</style>
person Robert    schedule 09.10.2014

У меня была именно эта проблема. По какой-то причине это помогло мне отбросить часть android: в определении AppTheme и оставить ее только как editTextStyle (как указано в этом ответе ):

<style name="AppTheme" parent="android:Theme.Light"> 
    <item name="android:fontFamily">Verdana</item>
    <item name="editTextStyle">@style/EditTextStyle</item>
</style>
person Štarke    schedule 15.07.2016

Вам нужно будет установить свойство style="@styles/EditTextStyle" для всех ваших компонентов EditText в вашем приложении.

person Morten Salte    schedule 15.07.2013
comment
Компонентов EditText так много ... я хотел избежать индивидуальной установки свойства для всех. Никакого другого пути, Мортен? - person Randomly Named User; 15.07.2013

определите атрибут стиля для всего EditText, как показано ниже:

   <EditText
    android:id="@+id/editText1"
    android:layout_height="wrap_content"
    style="@style/EditTextStyle">
person SKK    schedule 15.07.2013
comment
Я могу это сделать, но тогда мне придется делать это индивидуально для каждого editText в моем приложении ... их должно быть около 50! Нет более легкого пути? - person Randomly Named User; 15.07.2013

Вы должны указать layout_width индивидуально для каждого представления. Нет возможности спастись. Вы можете создать объект LayoutParams и установить в нем его ширину и высоту и установить в нем каждый EditText, например

textView1.setLayoutParams(lParams);
textView2.setLayoutParams(lParams);
...
person Naresh    schedule 15.07.2013