2013/12/08

PreferenceActivity で isValidFragment を override していないと RuntimeException が発生する

Eclipse の ADT ではいくつかのテンプレートが用意されていて、お決まりの class を作成する場合とても重宝しますNew → Other → Android → Android Object で選択できます。
Settings Activity もそのひとつ。
このテンプレートを使用すると、multi-pane layout の設定画面を手軽に作成することが出来ます。

multi-pane layout というのは、以下のように小型スマートフォンと大型タブレットで表示形式を変えるレイアウトのことです。
スマートフォンの設定画面
タブレットの設定画面

ところが、このタブレット用の画面を Android 4.4 (Kitkat) のタブレットで表示すると以下のような RuntimeException が発生し、アプリが落ちるようになってしまいました。
テンプレートを使用するとアプリが落ちてしまうというは、ちょっとダサい状況ですね。

FATAL EXCEPTION: main
Process: com.kokufu.android.apps.sqliteviewer, PID: 32372
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.kokufu.android.apps.sqliteviewer/com.kokufu.android.apps.sqliteviewer.base.SettingsActivity}: java.lang.RuntimeException: Subclasses of PreferenceActivity must override isValidFragment(String) to verify that the Fragment class is valid! com.kokufu.android.apps.sqliteviewer.base.SettingsActivity has not checked if fragment com.kokufu.android.apps.sqliteviewer.base.SettingsActivity$DisplayPreferenceFragment is valid.
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2176)
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2226)
 at android.app.ActivityThread.access$700(ActivityThread.java:135)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
 at android.os.Handler.dispatchMessage(Handler.java:102)
 at android.os.Looper.loop(Looper.java:137)
 at android.app.ActivityThread.main(ActivityThread.java:4998)
 at java.lang.reflect.Method.invokeNative(Native Method)
 at java.lang.reflect.Method.invoke(Method.java:515)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
 at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.RuntimeException: Subclasses of PreferenceActivity must override isValidFragment(String) to verify that the Fragment class is valid! com.kokufu.android.apps.sqliteviewer.base.SettingsActivity has not checked if fragment com.kokufu.android.apps.sqliteviewer.base.SettingsActivity$DisplayPreferenceFragment is valid.
 at android.preference.PreferenceActivity.isValidFragment(PreferenceActivity.java:898)
 at android.preference.PreferenceActivity.switchToHeaderInner(PreferenceActivity.java:1179)
 at android.preference.PreferenceActivity.switchToHeader(PreferenceActivity.java:1219)
 at android.preference.PreferenceActivity.onCreate(PreferenceActivity.java:564)
 at android.app.Activity.performCreate(Activity.java:5243)
 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2140)
 ... 11 more