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

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



    
        @style/edit_text_default
    

    
        10dp
    


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


...

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


    
        
    
    
        
    

Ответы на вопрос(3)

те изменить это на:

<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/MyTheme">
</application>
 Groppe01 нояб. 2012 г., 13:14
Извините, это была опечатка в посте с моей стороны. Они одинаковы в моем реальном проекте. Хорошее предложение, хотя: /

ответ Олива на другой вопрос Вот. Я пытался добавить поля для всех кнопок и обнаружил, что 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 гдеответ Олива на другой вопрос используется для установки поля 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>
Решение Вопроса

Короткий ответ: Если вы указываете layout_margin в пользовательском стиле, этот стиль должен явно применяться к каждому отдельному представлению, для которого вы хотите иметь указанное поле (как показано в примере кода ниже). Включение этого стиля в тему и применение его к вашему приложению или деятельности не будет работать.

<tablelayout xmlns:="http://schemas..com/apk/res/" xmlns:tools="http://schemas..com/tools" :layout_width="fill_parent" :layout_height="fill_parent" :background="#FFFFFF">
    <tablerow>
        <edittext :hint="@string/last_name" style="@style/edit_text_default">
    </edittext></tablerow>
    <tablerow>
        <edittext :hint="@string/first_name" style="@style/edit_text_default">
    </edittext></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 и пользователь StackOverflowadamp.

Также ответ данэтот вопрос пользователем StackOverflowinazaruk.

 Robert Tuck14 окт. 2016 г., 13:42
Этот ответ несколько неудовлетворителен - поля макета по-прежнему не применяются, даже если родительская ViewGroup и дочерняя View находятся в одном и том же файле XML макета. В этом случае инфляторделает знать о конкретном типе родительской ViewGroup (потому что она только что его раздула), а также знает стиль для применения (потому что применяются другие атрибуты стиля).
 pbarranis26 февр. 2016 г., 16:52
W ... T ... F ?? Зачем? Зачем? ЗАЧЕМ?!?! ... пожалуйста, прости меня ... яЯ схожу с ума со всеми причудами разработки Android.

Ваш ответ на вопрос