Краткий ответ: Если вы задаете 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
при применении LayoutParams
.
Указание layout_margin в стиле, включая этот стиль в теме, и попытка применить эту тему к приложению / действию приведет к удалению атрибутов макета, поскольку родительский элемент ViewGroup еще не указан и поэтому аргументы недопустимы , Однако применение стиля к представлению EditText
, определенному с помощью TableLayout
, работает, поскольку родительский элемент ViewGroup
(TableLayout
) известен.
Источники:
Документация Android по Параметры макета .
Ответ, данный на этот вопрос инженером фреймворка Android и пользователем StackOverflow adamp .
Кроме того, ответ, данный на этот вопрос пользователем StackOverflow inazaruk .
Мне не нужен кредит этого ответа Настоящий герой здесь - https://stackoverflow.com/a/13365288/4741746