Android – поля, указанные в пользовательском стиле, не действуют

Я хочу, чтобы по умолчанию для EditText был 10dp. Поэтому в моем файле styles.xml я установил следующее:

<resources xmlns:android="http://schemas.android.com/apk/res/android"> <style name="MyTheme" parent="android:style/Theme.NoTitleBar"> <item name="android:editTextStyle">@style/edit_text_default</item> </style> <style name="edit_text_default" parent="android:style/Widget.EditText"> <item name="android:layout_margin">10dp</item> </style> </resources> 

Затем в AndroidManifest.xml я задал тему приложения той, которую я определил:

 <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/MyTheme" > ... 

Работает тема «Без заголовка». Однако маржа по умолчанию для EditText не является, она по-прежнему заполняет родительский элемент. Вот мой табличный вид:

 <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#FFFFFF" > <TableRow> <EditText android:hint="@string/last_name" /> </TableRow> <TableRow> <EditText android:hint="@string/first_name" /> </TableRow> </TableLayout> 

Solutions Collecting From Web of "Android – поля, указанные в пользовательском стиле, не действуют"

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

 <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#FFFFFF" > <TableRow> <EditText android:hint="@string/last_name" style="@style/edit_text_default" /> </TableRow> <TableRow> <EditText android:hint="@string/first_name" style="@style/edit_text_default" /> </TableRow> </TableLayout> 

Объяснение: Атрибутами, начинающимися с layout_ являются LayoutParams или один из его подклассов (например, MarginLayoutParams ). LayoutParams используются представлениями, чтобы сообщить родителям ViewGroup, как они хотят быть выложены. Каждый класс ViewGroup реализует вложенный класс, который расширяет ViewGroup.LayoutParams . Поэтому LayoutParams относятся к ViewGroup . Это означает, что, хотя TableLayout и LinearLayout могут иметь layout_margin как один из его LayoutParams , они считаются совершенно разными атрибутами.

Таким образом, layout_margin – это не просто общий атрибут, который можно применять в любом месте. Он должен применяться в контексте ViewGroup который определяет его как действительный аргумент. В представлении должен быть ViewGroup тип его родительской ViewGroup при применении LayoutParams .

Указание layout_margin в стиле, включая этот стиль в теме и попытку применить эту тему к приложению / активности, приведет к отбрасыванию атрибутов макета, поскольку родитель ViewGroup еще не указан, и поэтому аргументы недействительны. Однако применение стиля к представлению EditText , которое было определено с помощью TableLayout работает, потому что родительская ViewGroup ( TableLayout ) известна.

Источники:

Документация Android по параметрам макета .

Ответ на этот вопрос задан разработчиком Android framework и пользовательским adamp StackOverflow.

Также ответьте на этот вопрос пользователем StackOverflow inazaruk .

Вы не используете правильное название темы в манифесте. Попробуйте изменить его на:

 <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/MyTheme" >