ローリングコンバットピッチなう!

AIとか仮想化とかペーパークラフトとか

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アプリにしか許可されないので実質無理。
さてさて、どうしたもんか。