Использовать layout_marginLeft в стиле кнопки, применяемом в качестве темы?

Я использовал атрибут layout_marginLeft="30dip" в стиле, определенном для кнопок. Когда я применяю этот стиль отдельно для каждой кнопки, левое поле помещается так, как я хотел.

Но потом я определил тему, где я присвоил стиль своей кнопки атрибуту android:buttonStyle и применил его к моему проекту.
Однако свойство левого поля игнорируется. Любая идея, что я должен делать здесь?

Style.xml следующим образом:

 <style name="btnstyle" parent="@android:style/Widget.Button"> <item name="android:layout_height">wrap_content</item> <item name="android:layout_width">wrap_content</item> <item name="android:layout_marginLeft">30dip</item> <item name="android:textColor">#FFFFFF</item> </style> <style name="appstyle" parent="android:Theme"> <item name="android:buttonStyle">@style/btnstyle</item> </style> 

Solutions Collecting From Web of "Использовать layout_marginLeft в стиле кнопки, применяемом в качестве темы?"

Похоже, это может быть достигнуто путем обертывания метки вставки вокруг формы.

Как это:

 <inset xmlns:android="http://schemas.android.com/apk/res/android" android:insetLeft="5dp" android:insetRight="5dp" android:insetTop="5dp" android:insetBottom="5dp"> <shape android:shape="rectangle"> <solid android:color="#fff"/> <stroke android:width="1dp" android:color="#333"/> <corners android:radius="10dp"/> </shape> </inset> 1 <inset xmlns:android="http://schemas.android.com/apk/res/android" android:insetLeft="5dp" android:insetRight="5dp" android:insetTop="5dp" android:insetBottom="5dp"> <shape android:shape="rectangle"> <solid android:color="#fff"/> <stroke android:width="1dp" android:color="#333"/> <corners android:radius="10dp"/> </shape> </inset> 

В stackoverflow есть отличный ответ. В основном LayoutParams (layout_) используются для дочерних просмотров, чтобы сообщить родительской ViewGroup как они должны быть расположены. Но LayoutParams специфичны для каждого типа ViewGroup ( LinearLayout , RelativeLayout , FrameLayout и т. Д.), Поэтому LayoutParams не могут быть обобщены таким образом для темы.

Все это очень печально, так как вы не можете использовать полностью обобщенные стили в теме, но вы все равно можете использовать стиль для каждого конкретного вида, где вам это нужно, например:

 <Button style="@style/btnstyle"/> 

Когда-нибудь доходите до сути? У меня такая же проблема; Все атрибуты поля игнорируются при применении к Button или ImageButton через стиль внутри темы.

Тем не менее, я обнаружил, что он работает, когда стиль применяется напрямую, используя атрибут «стиль» на кнопке. Кажется, что поля не являются частью спецификации «buttonStyle».

Я предполагаю, что это ошибка в Android.

С другой стороны, когда я начал использовать стили, я размещал все внутри стиля. Я заметил, что создаю стиль для каждого виджета. Прямо сейчас, я помещаю атрибуты позиции внутри стиля.

Таким образом, свойства width , height , padding и layout в элементе XML и остальные атрибуты внутри стиля.

Короткий ответ: если вы указываете 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 .

Я не хочу получить кредит на этот ответ, настоящий герой здесь – https://stackoverflow.com/a/13365288/4741746