it-swarm.com.ru

Android - поля, указанные в пользовательском стиле, не вступают в силу

Я хочу, чтобы по умолчанию для EditText было поле 10dp. Поэтому в моем файле styles.xml я настроил следующее:

<resources xmlns:Android="http://schemas.Android.com/apk/res/Android">

    <style name="MyTheme" parent="Android:style/Theme.NoTitleBar">
        <item name="Android:editTextStyle">@style/edit_text_default</item>
    </style>

    <style name="edit_text_default" parent="Android:style/Widget.EditText">
        <item name="Android:layout_margin">10dp</item>
    </style>

</resources>

Затем в AndroidManifest.xml я установил тему приложений на ту, которую я определил:

<application
     Android:icon="@drawable/ic_launcher"
     Android:label="@string/app_name"
     Android:theme="@style/MyTheme" >
...

Работает тема «Без заголовка». Однако поля по умолчанию для EditText нет, он все еще заполняет родительский элемент. Вот мой вид таблицы:

<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" />
    </TableRow>
    <TableRow>
        <EditText Android:hint="@string/first_name" />
    </TableRow>
</TableLayout>
27
Groppe

Short Answer: Если вы задаете 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 .

48
Groppe

Вы не используете правильное название темы в своем манифесте. Попробуйте изменить это на:

<application
     Android:icon="@drawable/ic_launcher"
     Android:label="@string/app_name"
     Android:theme="@style/MyTheme" >
1
James McCracken

На всякий случай, если это будет полезно для других, я бы хотел принести ответ Олива на другой SO вопрос здесь . Я пытался добавить поля для всех кнопок и обнаружил, что layout_margin не работает ,.

Тема:

<style name="FooThemeStyle" parent="Base.Theme.AppCompat">
    <item name="Android:buttonStyle">@style/FooButton</item>
    <item name="buttonStyle">@style/FooButton</item>
</style>

Стиль кнопки:

<style name="FooButton" parent="Widget.AppCompat.Button">
    <item name="Android:background">@drawable/button_background</item>
</style>

Вот button_background.xml, где ответ Олива на другой SO вопрос используется для установки поля в 2dp:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item
        Android:bottom="2dp"
        Android:left="2dp"
        Android:right="2dp"
        Android:top="2dp">
        <selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
          ...
        </selector>
    </item>
</layer-list>
0
Hong