将自定义主题应用到PreferenceFragment

8

我有一个左右两个碎片视图,右侧碎片中启动了一个PreferenceFragment。问题是该碎片没有任何样式,并且看起来非常扭曲。是否有一种方法只对PreferenceFragment应用主题?

我尝试过这个方法,但它没有成功。

我的代码:

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    // create ContextThemeWrapper from the original Activity Context with the custom theme
    final Context contextThemeWrapper = new ContextThemeWrapper(getActivity(), R.style.AppTheme_PreferenceTheme);

    // clone the inflater using the ContextThemeWrapper
    LayoutInflater localInflater = inflater.cloneInContext(contextThemeWrapper);


    View view = super.onCreateView(localInflater, container, savedInstanceState);

    return view;

}

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState); 

    addPreferencesFromResource(R.xml.app_settings_preference_layout);
}

我认为解决方案不起作用是因为我已经在onCreate中填充了preference-layout。是否有一种方法可以使用LayoutInflater服务而不使用addPreferencesFromResource方法来填充preference-layout?

2个回答

2
我使用这个来为PreferenceFragments设置样式:

<style name="PreferenceTheme" parent="@style/AppTheme">
    <item name="android:textColor">@color/colorPrimary</item>
    <item name="android:background">@color/cpWhite</item>
    ...
</style>

然后,在onCreateView方法中:
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    ...
    container.getContext().setTheme(R.style.PreferenceTheme);
}

这对我很有用。希望它也能帮到你。

0
在2022年,如果您使用PreferenceFragmentCompat创建首选项屏幕,您可以在其源代码中找到获取主题的尝试,该主题来自R.attr.preferenceTheme。因此,如果您将此值设置为所需的主题,则会应用所需的主题。类似于以下内容:
<style name="AppTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
    ...
    <item name="preferenceTheme">@style/SettingsTheme</item>
    ...
</style>

<style name="SettingsTheme" parent="@style/PreferenceThemeOverlay">
    <item name="preferenceCategoryTitleTextColor">?attr/colorPrimary</item>
</style>

对我来说完美地工作了


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接