1. ホーム
  2. android

[解決済み] Fragment テーマ onCreate で preferenceTheme を指定する必要がある。

2022-02-07 12:57:50

質問

このエラーが発生する原因を探っています。

java.lang.IllegalStateException: Must specify preferenceTheme in theme
at android.support.v7.preference.PreferenceFragmentCompat.onCreate(PreferenceFragmentCompat.java:210)
at android.support.v4.app.Fragment.performCreate(Fragment.java:2177)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager

私のPreferenceFragmentCompatを実行しようとすると これは上記のクラスコードです。

public class SettingsFragment extends PreferenceFragmentCompat {

public SettingsFragment() {
    // Required empty public constructor
}

public static SettingsFragment newInstance() {
    SettingsFragment fragment = new SettingsFragment();
    return fragment;
}

@Override
public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
    setPreferencesFromResource(R.xml.settings_preferences, rootKey);
}

}

これは、フラグメントを示すアクティビティのマニフェスト宣言です。

<activity
        android:name=".active_minutes_screen.view.ActiveMinutesActivity"
        android:theme="@style/AppTheme.NoActionBar">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>

            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
</activity>

上記MainActivity内のフラグメントを表示するコード

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, HistoryFragment.newInstance());
ft.commit();

MainActivityで適用しているテーマ

<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style>

解決方法は?

パンサーさんが提案してくれた解決策に感謝します。私がしなければならなかったのは、次の行を追加することだけです。 <item name="preferenceTheme">@style/PreferenceThemeOverlay</item> を、私のPreferenceFragmentを表示している個々のアクティビティーのテーマではなく、私のアプリケーションのテーマに追加しました。

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="preferenceTheme">@style/PreferenceThemeOverlay</item>
</style>

または

<item name="preferenceTheme">@style/PreferenceThemeOverlay.v14.Material</item>

で、モダンな素材感を表現しています。