Ответ 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.