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

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

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 в отдельности?

Вы можете попробовать это. Вот часть файла манифеста, которую вам нужно изменить, чтобы вызвать вашу собственную тему (пользовательская тема, называемая здесь 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> 

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

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

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

Android: тема = "@ стиль /"

  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: часть в определении AppTheme и оставить его только как editTextStyle (как упоминалось в этом ответе ):

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

К сожалению, невозможно установить атрибуты макета (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> 

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

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

  <EditText android:id="@+id/editText1" android:layout_height="wrap_content" style="@style/EditTextStyle"> 

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

 textView1.setLayoutParams(lParams); textView2.setLayoutParams(lParams); ...