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

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

Android Studioでjlinkが見つからない件

課題

Android StudioのCanary版でJetpack composeを実装してビルドしようとしたところ以下のエラーに遭遇。 jlnkファイルがないと言われている。見ると確かに存在しない。

/Users/xxx/Library/Application Support/JetBrains/Toolbox/apps/AndroidStudio/ch-0/202.7049475/Android Studio Preview.app/Contents/jre/jdk/Contents/Home/bin/jlink does not exist.

対応

OpenJDKをダウンロードし、Project StructureのJDK Locationに設定する

jlinkだけAndroid Studioにコピーしてくる方法もあるけど、アプデで修正されてないとまたエラーになるので 修正されるまではJDK Locationを変えちゃった方が良さそう。

参考

https://issuetracker.google.com/issues/176415597

Jetpack Compose:アイコン付きテキストを作る

試行錯誤の記録。慣れるまでが一苦労。Android Studioのレイアウトエディターとか完全に無用の長物になってしまったな。

アイコン付きテキスト

左にアイコンがあってテキストが続くようなよくあるケース

@Composable
fun TextWithIcon() {
    Row(verticalAlignment = Alignment.CenterVertically,
        modifier = Modifier.wrapContentHeight()) {
        Icon(
            vectorResource(id = R.drawable.ic_info_black_20px),
            modifier = Modifier
                .height(18.dp)
                .width(18.dp)
                .align(Alignment.CenterVertically)
        )
        Spacer(modifier = Modifier.width(16.dp))
        Text(
            text = stringResource(id = R.string.sample_text),
            fontSize = 12.sp,
            modifier = Modifier.align(Alignment.CenterVertically)
        )
    }
}

ポイント

  • 横に並べたいのでRowを使う
  • アイコンとテキストの高さを揃えたいので親のRowで verticalAlignment() を指定
  • SVG画像は vectorResource(id=) で取得
  • アイコンとテキスト間の余白は Spacer で確保

Retrofit:responseBodyがnullのsuspend関数を定義する

課題

Retrofit2でレスポンスが空のsuspend関数を定義したい場合、以下の書き方だとエラーになる。

suspend fun like( itemId:Int ) :Unit  // 単にCallを外しただけだとNG。Void, Unit?も同様
<クラス名> was null but response body type was declared as non-null

対応

Response<Unit> とすることで レスポンスbodyのnullチェックが行われなくなる。

suspend fun like( itemId:Int ) : Response<Unit> // Response<Void>も可
suspend fun postLike() :Response<Unit>

問題

Response<Unit> を使っているとレスポンスコードが200台以外でも例外にならないようだ。

参考

github.com