Android 10.1インチ タブレットの実機でPreferenceActivity(設定画面)を開くとjava.lang.ClassNotFoundExceptionが発生して強制終了するエラーが頻繁に上がってきました。InstantiationExceptionってのも発生しています。
ちなみに、エミュレーター(PC上の仮想デバイス)では発生しません。
PreferenceActivityは、Eclipseのウィザードで「Setting Activity」を選択して作成したものです。
で、ClassNotFoundExceptionが発生するのは10.1インチの実機のタブレットのみ。弊社で所有している7インチのNexus7では発生しません。
ALWAYS_SIMPLE_PREFS = trueに!
で、結論から言うと、10.1以上のタブレットでもtwo-pane viewみたいな表示にしないで、常にシンプルな方にすれば解消されます。
private static final boolean ALWAYS_SIMPLE_PREFS = false;
ALWAYS_SIMPLE_PREFSをtrueにすれば強制終了は解消されます。
private static final boolean ALWAYS_SIMPLE_PREFS = true;
エラーはこんな感じです。
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.hoge.hogehoge/com.hoge.hogehoge.HogePreference}: android.app.Fragment$InstantiationException: Unable to instantiate fragment com.hoge.hogehoge.HogePreference$GeneralPreferenceFragment: make sure class name exists, is public, and has an empty constructor that is public at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2070) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2095) at android.app.ActivityThread.access$600(ActivityThread.java:137) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1206) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:213) at android.app.ActivityThread.main(ActivityThread.java:4791) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556) at dalvik.system.NativeStart.main(Native Method) Caused by: android.app.Fragment$InstantiationException: Unable to instantiate fragment com.hoge.hogehoge.HogePreference$GeneralPreferenceFragment: make sure class name exists, is public, and has an empty constructor that is public at android.app.Fragment.instantiate(Fragment.java:584) at android.preference.PreferenceActivity.switchToHeaderInner(PreferenceActivity.java:1138) at android.preference.PreferenceActivity.switchToHeader(PreferenceActivity.java:1171) at android.preference.PreferenceActivity.onCreate(PreferenceActivity.java:562) at android.app.Activity.performCreate(Activity.java:5008) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2034) ... 11 more Caused by: java.lang.ClassNotFoundException: com.hoge.hogehoge.HogePreference$GeneralPreferenceFragment at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:61) at java.lang.ClassLoader.loadClass(ClassLoader.java:501) at java.lang.ClassLoader.loadClass(ClassLoader.java:461) at android.app.Fragment.instantiate(Fragment.java:574) ... 17 more
この値を変えると何が変わるかというと、10.1インチ以上のタブレットの設定画面のスタイルが変わります。
ソースを見てみると、スクリーンのサイズで処理を分岐しているんですが、その辺が関係しているように思います。
/** * Helper method to determine if the device has an extra-large screen. For * example, 10" tablets are extra-large. */ private static boolean isXLargeTablet(Context context) { return (context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) >= Configuration.SCREENLAYOUT_SIZE_XLARGE; }
根本解決になっている訳ではないのですが、あまり時間もかけたくないので。
SDK ManagerでそのうちSDKをアップデートすれば直っている気もします。
株式会社woodsmallの小林でした。
https://woodsmall.co.jp/
コメント