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>

Ответ 1

Короткий ответ: Если вы указываете 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. Это означает, что хотя a TableLayout и a LinearLayout могут иметь layout_margin как один из них LayoutParams, они считаются совершенно разными атрибутами.

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

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

Источники:

Документация для Android на Параметры макета.

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

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

Ответ 2

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

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