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

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

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など、かえって本来不要なファイルが増える。

Andoid6.0でVector画像のdrawableStart, drawableEndのSelectorが機能しない

課題

Selectorを使用したdrawableを作成し、それをTextViewのdrawableStartに設定したが、
Android6.0系の端末だけ初期表示時に有効にならない。
リロードすると正しく表示される。

対応


おそらくバグ。とりあえず主な対処方法は2つ

drawableStart、drawableEndを使わず、drawableLeftとdrawableRightのみを設定する。

両方書いてあると駄目なので旧記法だけにする

Selectorの状態を変更する際にpostを使う

レンダリングをワンテンポ遅らせることで正しく描画される

textView.post {
            textView.isSelected = true
}

特定のバージョン向けの対応なので、どっちもどっち。
ただし画面によっては再現しないのでもう少し条件があるかも。
また、AndroidStudioやSupport Libraryのバージョンも関係してるかもしれない。

ちなみにTextView以外やdrawableTop、drawableBottomでは問題は発生しない

前画面に戻った際にAppBarLayoutのスクロール状態が元に戻ってしまう

課題

CoordinatorLayoutを使っている画面で、画面遷移後にバックボタンを押下すると
端末によってはスクロール位置が保持されずにAppBarLayoutが全て開いた状態になってしまっている。
どうすればいいか。

対応

CoordinatorLayoutにidを付与する。
バックボタンで前画面に戻った場合、スクロールなどのViewの状態はAndroid側でよしなに戻してくれるが、
ViewにIDが付与されていないと値を戻す対象を見つけられず、戻せないため初期状態のままとなる。
AppBarのスクロール状態の復帰にはCoordinator側にもidの設定が必要。

必ず発生する訳でもなさそうだが、発生した場合にはIDの設定漏れを疑ってみる。