Использовать layout_marginLeft в стиле кнопки, применяемом в качестве темы?
Я использовал атрибут layout_marginLeft="30dip"
в стиле, определенном для кнопок. Когда я применяю этот стиль отдельно для каждой кнопки, левое поле помещается так, как я хотел.
Но потом я определил тему, где я присвоил стиль своей кнопки атрибуту android:buttonStyle
и применил его к моему проекту.
Однако свойство left margin игнорируется. Любая идея, что я должен здесь сделать?
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>
Ответы
Ответ 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>
Ответ 2
Существует замечательный ответ fooobar.com/questions/22389/.... В основном LayoutParams
(layout_) используются для дочерних просмотров, чтобы сообщить родителям ViewGroup
, как они должны быть расположены. Но LayoutParams
специфичны для каждого типа ViewGroup
(LinearLayout
, RelativeLayout
, FrameLayout
и т.д.), Поэтому LayoutParams
не может быть обобщен таким образом для темы.
Все это очень печально, так как вы не можете использовать полностью обобщенные стили в теме, но вы все равно можете использовать стиль для каждого конкретного вида, где вам это нужно, например:
<Button style="@style/btnstyle"/>
Ответ 3
Когда-нибудь дойдете до конца? У меня такая же проблема; все атрибуты поля игнорируются при применении к Button или ImageButton через стиль внутри темы.
Однако я обнаружил, что он работает, когда стиль применяется напрямую, используя атрибут "style" на кнопке. Кажется, что поля не являются частью спецификации "buttonStyle".
Ответ 4
Я бы предположил, что это ошибка в Android.
С другой стороны, когда я начал использовать стили, я поместил все внутри стиля. Я заметил, что создавал стиль для каждого виджета. Прямо сейчас я помещаю атрибуты позиции в стиль.
Итак, width
, height
, padding
и layout
свойства в элементе XML и остальные атрибуты внутри стиля.
Ответ 5
Короткий ответ: Если вы указываете 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.
Я не хочу, чтобы какой-либо кредит этого ответа был настоящим героем здесь - fooobar.com/info/22389/...