Hatena::ブログ(Diary)

前人未踏の領域へ

2018-06-09

[]AndroidX Refactor to AndroidX...

Android StudioのAndroidX対応の置換機能を使ったら
ConstraintLayoutのところでClassNotFoundExceptionが発生した。

Caused by: java.lang.ClassNotFoundException: Didn't find class "androidx.constraintlayout.widget.ConstraintLayout"

正しくは

androidx.constraintlayout.ConstraintLayout

どうやらバグらしい。

2018-05-31

[]開発者オプション:アクティビティを保持しない


開発者オプション:アクティビティを保持しないをONにすると
Activity遷移時に付与したIntentパラメータが遷移先のActivityで受け取れないっぽい。

端末 or OSバージョン依存かも。

2018-05-30

[] 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してカスタマイズしないと使えない気がする。

2018-03-13

[]プログラム上から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)

2018-03-07

[]4系端末にSVG画像を適用する方法と注意点


一応自分で試して対応は確認できたが採用はしていない。以下は必要になった場合に備えての記録。

課題

4系端末でもSVG画像を使いたいが上手く表示されなかったりアプリが落ちたりする。
どうすればよいか。

対応


参考URLの記事を読めば全て書いてあるが、
いくつかの専用の記述が必要となる。

app/build.gradle

vectorDrawablesではuseSupportLibraryを使うよと宣言

android {
  defaultConfig {
    vectorDrawables.useSupportLibrary = true
  }
}

ImageView

app:srcCompatをに指定する。

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:srcCompat="@drawable/ic_search"/>

ImageView以外で使う場合

Vectorを読み込めるようにするために
ApplicationクラスまたはトップのActivityなどに以下を記述する。

static {
AppCompatDelegate.setCompatVectorFromSourcesEnabled(true);
}

また直接Vectorを指定できないので別なLayerListやInsetDarwable, SelectorなどのDrawableを経由する必要がある

<selector xmlns:android="...">
    <item android:drawable="@drawable/ic_search" />
</selector>

状態を持たなくてもいいのでとりあえず1つだけセレクターを挟む。

注意点


  • NotificationのアイコンはID指定をする必要があり、Vector画像はおそらく使えない
  • ImageView以外でVector画像を使う際の対応が煩雑。selectorなど、かえって本来不要なファイルが増える。

参考

https://medium.com/@chrisbanes/appcompat-v23-2-age-of-the-vectors-91cbafa87c88