2014年1月24日金曜日

targetSdkVersionを19にすると、Preference画面で強制終了する

Android Manufestのandroid:targetSdkVersionを19にすると、Preference画面を開いて操作しようとすると強制終了するようになった。調べてみると、これが原因らしい。
The default result of {android.preference.PreferenceActivity#isValidFragment PreferenceActivity.isValueFragment} becomes false instead of true.
引用: http://developer.android.com/reference/android/os/Build.VERSION_CODES.html#KITKAT

エラーメッセージをよく見るとこんな行があった。
01-24 00:35:10.461: E/AndroidRuntime(29584): Caused by: java.lang.RuntimeException: Subclasses of PreferenceActivity must override isValidFragment(String) to verify that the Fragment class is valid! com.fb.fumotrim.ui.FTPreferenceActivity has not checked if fragment com.fb.fumotrim.ui.FTPreferenceActivity$PF_System is valid.
PreferenceActivityのサブクラスを作る時は、isValidFragment(String)をオーバーライドして、PreferenceFragmentがvalidかどうか検証すれよってことだ。
それで、どうやって書けばいいかと調べていたら、stackoverflowに書いてあった。流石stackoverflow!

http://stackoverflow.com/questions/19973034/isvalidfragment-android-api-19
protected boolean isValidFragment (String fragmentName)
{
  if(StockPreferenceFragment.class.getName().equals(fragmentName))
      return true;
  return false;

}
こんなかんじの内容にすれば良いらしい。フラグメント名をチェックするだけ。proguardを使っている場合は、クラス名の比較に失敗するようなので、proguard.cfgに以下のような例外を追加すると良い。
-keep public class com.fullpackage.MyPreferenceFragment

0 件のコメント:

コメントを投稿