Пользовательские представления и defStyleAttr - PullRequest
0 голосов
/ 11 апреля 2019

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

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

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 голосов
/ 12 апреля 2019

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

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

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

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

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

Тема

styles.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">

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

some.xml

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

Androids Way

Но я хотел точно знать, как все это связано, чтобы потом работать без атрибутов 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 или что-то еще).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...