Пользовательские представления и defStyleAttr

Я борюсь с пользовательскими представлениями defStyleAttr. (Короткое примечание, я использую Preference в качестве примера, потому что это так же, как Google использует его)

Таким образом, почти для каждого View или Preference, предоставляемого Android, у вас будет конструктор вроде это:

public SeekBarPreference(Context context, AttributeSet attrs) {
        this(context, attrs, R.attr.seekBarPreferenceStyle);
}

Это определяет атрибут стиля по умолчанию как R.attr.seekBarPreferenceStyle.

Если вы сейчас посмотрите на определение, вы найдете это:

<attr name = "seekBarPreferenceStyle" format = "reference" />

До сих пор все ясно. Но этот атрибут каким-то образом связан с тема:

<resources>
    <style name = "PreferenceThemeOverlay">
        <!-- ... -->
        <item name = "seekBarPreferenceStyle">@style/Preference.SeekBarPreference.Material</item>
        <!-- ... -->
    </style>
    <!-- ... -->
</resources>

Который затем, наконец, связывает стиль с необходимым идентификатором ресурса макета, который будет передан суперклассу для надувания:

<style name = "Preference.SeekBarPreference.Material">
        <item name = "android:layout">@layout/preference_widget_seekbar_material</item>
        <!-- ... -->
</style>

К сожалению, мне не удалось найти подсказку о том, как тема PreferenceThemeOverlay связана с атрибутом seekBarPreferenceStyle.

Так как же эти два связаны?

1
0
1 064
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Наконец-то я нашел отвечать, в котором объяснялись основы, которые вам нужно знать.

Пользовательский вид

В примерах я использую SeekBarPreference как пользовательский объект (Preference и View очень похожи)

Короче говоря, есть два способа установить стиль по умолчанию.

Либо установите пользовательскую тему для своей активности (или тому подобное), которая связывает что-то с вашим пользовательским стилем (seekBarPreferenceStyle), либо установите стиль непосредственно с помощью атрибута style XML.

Тема

стили.xml

<style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar">
    <item name = "seekBarPreferenceStyle">@style/LINK_TO_DEFINING_STYLE</item>
</style>

AndroidManifest.xml

<activity android:name = ".SomeActivity" android:theme = "@style/AppTheme">

Атрибут стиля

какой-то.xml

<SeekBarPreference
[...]
style = "@style/LINK_TO_DEFINING_STYLE"
[...] />

Путь андроидов

Но я хотел точно знать, как все это связано с тем, чтобы работать без каких-либо атрибутов style в файлах XML для SeekBarPreference или других объектов Preference и View, предоставляемых Android.

Итак (через Android Studio) я проследил Theme.AppCompat.Light.DarkActionBar до его родителя Theme.Holo.Light и посмотрел, что я там нашел:

<!-- ... -->
<item name = "seekBarPreferenceStyle">@style/Preference.Holo.SeekBarPreference</item>
<!-- ... -->

Ссылка на стиль это, который связывает ресурс макета:

<style name = "Preference.Holo.SeekBarPreference">
    <item name = "layout">@layout/preference_widget_seekbar</item>
</style>

И, наконец, чтобы снова ввести вас в заблуждение, Android, похоже, связывает стиль материала из вопроса вместо темы Holo из ответа с темой по умолчанию (будь то DeviceDefault или что-то еще).

Так что, если у вас есть какие-либо подсказки по этому поводу, пожалуйста, не стесняйтесь добавлять в комментарии :)

Другие вопросы по теме