Подтвердить что ты не робот

Использовать 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>
4b9b3361

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