Я борюсь с пользовательскими представлениями 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.
Так как же эти два связаны?
Наконец-то я нашел отвечать, в котором объяснялись основы, которые вам нужно знать.
В примерах я использую 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 или что-то еще).
Так что, если у вас есть какие-либо подсказки по этому поводу, пожалуйста, не стесняйтесь добавлять в комментарии :)