2017年2月23日木曜日

BadParcelableException

Android 4.2.2にて(6.0.1では大丈夫だった)。
SupportMapFragmentで以下のライブラリを使用して、Activity再生成すると落ちる。

https://github.com/Clans/FloatingActionButton

MapViewでも同様のようだ。

https://github.com/Clans/FloatingActionButton/issues/56

これはこのライブラリのせいじゃなくてGoogleのせい。2014年からすでに話題になっているが、いまだになおってない。
→com.google.android.gms:play-services-maps:10.2.0 でなおってた

詳しい原因は分からないが、Activity再生成時(saveInstanceState != null)にsaveInstanceStateにParcelクラスのインスタンス(今回は上記ライブラリの状態情報)が入っていると落ちる。onCreateでsuper.onCreate(savedInstanceState)をやるまえに、savedInstanceStateからこのインスタンスを削除してやれば落ちない(削除する状態情報はあとで自前で復帰してやる)。こんな感じ?

if(savedInstanceState != null) {
    SparseArray viewState = (SparseArray)savedInstanceState.get("android:view_state");
     mButton1State = (Parcelable)viewState.get(R.id.button1, null);
     viewState.remove(R.id.button1);
}

以下にMapViewの例がある。


2017年2月6日月曜日

Runtime Permission

アプリ動作中に設定からアプリの権限を変更したらどうなるか?

 ・拒否から許可に変えた場合
  →Pause中ActivityのonResume()から再開

 ・現状が許可であろうと拒否であろうと、一度でも拒否にした場合
  →Applicationインスタンスが再生成され、
   Pause中のActivityも再生成される。
         (fragmentはsetRetainInstance(true)がされている場合はonCreateViewから)

2017年2月3日金曜日

MaterialSeekBarPreference

 設定画面にスライダーを表示したくてPreferenceFragmentCompatを試したが何故かうまくいかず、何とか簡単に済ませる方法はないものかと探して、このライブラリにたどり着いた。

MaterialSeekBarPreference

しかしなぜかSeekBarの値がTextViewに反映されない。notifyChanged()したりいろいろ試したが、結局、PreferenceFragmentを挿れる部分がルート?(android.R.id.content)じゃないとダメだということがわかった。

        getFragmentManager().beginTransaction().replace(android.R.id.content, new PreferenceFragment()).commit();


しかし、これくらい標準で簡単にできるようにしてくれ。

2017年2月1日水曜日

PreferenceFragmentCompat

以下が出てハマった。
 Caused by: java.lang.RuntimeException: Content has view with id attribute 'android.R.id.list_container' that is not a ViewGroup class

かなり調べたが解決ならず。サポートライブラリのバグという話もある。
PreferenceFragmentCompatはこの問題を解決できたとしてもいろいろ鬼門っぽいので、とりあえず他の方法を考えるか・・・

Support Libraryの最新バージョン

以下でわかる。日本語で見ると情報が古いので注意。
https://developer.android.com/topic/libraries/support-library/packages.html

ちなみに、Support Libraryを使用するためには、Android Support Repository パッケージのインストールが必要。
https://developer.android.com/topic/libraries/support-library/setup.html?hl=ja

startForegroundの引数

startForeground(int, Notification)
第一引数はnotificationのID。0はダメ。
以前は第二引数にアイコン0のNotificationを渡せば通知を非表示にできたらしいが、4.3あたりからできなくなったらしい。