前人未踏の領域へ Androidアプリ開発編

Androidアプリ開発に関する調査メモ置き場。古い記事にはアプリ以外も含まれます。

AndroidX対応

プロジェクトをAndroidX に対応させようかと下記URL参考にやってみたが一筋縄ではいかない感じであった。
https://android-developers.googleblog.com/2018/05/hello-world-androidx.html

最終的に成功してないのでこの記事は途中経過の記録である。

対応

app/build.gradleを更新
    buildToolsVersion '28.0.0-rc2'
    compileSdkVersion 'android-P'
    targetSdkVersion 27
    minSdkVersion 16

現時点ではcompileSdkVersion は28でも 'P' でもなく 'android-P' とする

リファクタリング機能で一括変換

プロジェクト内から該当ファイルを見つけて置換してくれる。
ここまではうまくいった。

発生した問題

  • targetSdkVersionを'P'にするとminSdkVersion が P より大きいと怒られる
  • ButterKnifeの自動生成コードが対応してないのでコンパイルエラーになる。

https://github.com/JakeWharton/butterknife/issues/1280

ButterKnifeに限らず自動生成系のライブラリに依存している場合はそちらが対応するのを待つか
自分でForkしてカスタマイズしないと使えない気がする。

プログラム上からSelectorを設定する

課題

同じレイアウトファイルを使うが色が異なる2つのパーツがあり、
プログラム上からselectorを設定し、isSelectedを使ったがsetTextColorとsetBackgroundColorが機能しない。どうすればいいか。

対応

TextColorの場合

プログラム上からsetTextColorでSelectorを使うには引数にcolorStateListを渡す必要がある。ContextCompat.getColor()では駄目で、
ContextCompat.getColorStateListを使う

viewHolder.label?.setTextColor(ContextCompat.getColorStateList(context, R.color.selector_text))
背景色の場合

setBackgroundColorではなくsetBackgroundResourceを使う

selector_bg.xml
<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/dark" android:state_selected="true"/>
    <item android:drawable="@color/white" android:state_selected="false" />
</selector>  
viewHolder.itemView.setBackgroundResource(R.drawable.selector_bg)