android5.0 SwitchPreference
自分のアプリのクラッシュレポートが最近上がる様になったのでちょっと調査。
どうもandroid5.0で問題が発生するらしい。
問題の内容は
- SwitchPreferenceのスイッチ部分が表示されない
- SwitchPreferenceにタッチするとNull Pointer Exceptionが発生
自分はだいたいandroidアプリの設定画面はxmlで構成を書いてPreferenceActivityから派生されたActivity内で
addPreferencesFromResource(R.xml.xxxpreference);
みたくやっていて、addPreferencesFromResourceが最近がdepreciatedだからなのか?とか色々切り分けやってみたところ、どうもswitch表示のthumbのリソースが設定されていないっぽい。
AndroidManifest.xmlでactivtyのthemeを
<activity android:name=".xxxPreferenceActivity" android:label="@string/app_name" android:theme="@android:style/Theme.Black" android:launchMode="singleTop" android:exported="false" > </activity>
とやっているthemeの設定を消すとswitch表示が正常になることを発見。
他にも色々試した結果、真の原因解析までは至ってませんが、とりあえずの対処として
<activity android:name=".xxxPreferenceActivity" android:label="@string/app_name" android:theme="@android:style/Theme.DeviceDefault" android:launchMode="singleTop" android:exported="false" > </activity>
で逃げました。Theme.DeviceDefaultだと問題無い様です。UIの見た目が変わりますが、5.0端末だと流行りのマテリアルデザインになるのでとりあえず良いかなと。
それはともかくandroid5.0、他にも色々framework周りに手が入っていて、ConnectivityService#setMobileDataEnabledが使えなくなってしまいました。正確にはTelephonyServiceに同等の非公開APIが移動、MODIFY_PHONE_STATE permissionが必要なんですが、これはsystemアプリにしか許可されないので実質無理。
さてさて、どうしたもんか。