Ответ 1
Проблема, с которой вы сталкиваетесь, связана с Context
и тем, как работает ее тематика. Ваш код извлекает контекст, передавая getActivity()
конструктору, однако это не тот контекст, который вы хотите. Здесь решение, которое применяет правильные стили:
final Context ctx = getPreferenceManager().getContext();
for (...) {
final ListPreference p = new ListPreference(ctx);
// [...]
category.addPreference(p);
}
Описание
Здесь PreferenceFragmentCompat
onCreate(...)
метод:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TypedValue tv = new TypedValue();
this.getActivity().getTheme().resolveAttribute(attr.preferenceTheme, tv, true);
int theme = tv.resourceId;
if(theme <= 0) {
throw new IllegalStateException("Must specify preferenceTheme in theme");
} else {
this.mStyledContext = new ContextThemeWrapper(this.getActivity(), theme);
this.mPreferenceManager = new PreferenceManager(this.mStyledContext);
// [...]
this.onCreatePreferences(savedInstanceState, rootKey);
}
}
Важные строки:
this.getActivity().getTheme().resolveAttribute(attr.preferenceTheme, tv, true);
int theme = tv.resourceId;
Здесь preferenceTheme
извлекается из темы "Активность". Если он существует (т.е. theme
не равен 0), PFC (PreferenceFragmentCompat
) создает новую обертку темы, которая будет содержать информацию о стиле:
this.mStyledContext = new ContextThemeWrapper(this.getActivity(), theme);
Используя этот стиль, PFC теперь может создать PreferenceManager
:
this.mPreferenceManager = new PreferenceManager(this.mStyledContext);
Этот корневой стиль PFC теперь представляет собой preferenceTheme
, который содержит все различные подтипы (например, preferenceStyle
).
Проблема с вашим решением заключается в том, что класс Preference
ищет атрибут preferenceStyle
в контр-переданном контексте. Однако он определен только в вашем preferenceTheme
, а не в теме "Активность".