Использовать layout_marginLeft в стиле кнопки, применяемой в качестве темы? - PullRequest
28 голосов
/ 23 сентября 2010

Я использовал атрибут 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>

Ответы [ 5 ]

13 голосов
/ 04 января 2014

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

Как это:

<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>
10 голосов
/ 21 марта 2013

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

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

<Button style="@style/btnstyle"/>
3 голосов
/ 10 января 2011

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

Однако я обнаружил, что работает , когда стиль применяется напрямую с использованием стиля"атрибут на кнопке.Похоже, поля не являются частью спецификации "buttonStyle".

2 голосов
/ 25 ноября 2011

Я думаю, это ошибка в Android.

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

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

0 голосов
/ 01 августа 2017

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

...