3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Android】Jetpack Composeで、表示させたいURLの画像をImageに渡す方法

Posted at

アプリを作っていて・・・

ユーザーが保存した画像を、アイコンとして表示させたいなと思っていました。
ところが、今までアプリの内部で保存されていた画像リソースを参照して表示するくらいの機能しか作ったことがありませんでした。

そこで、どうやったら画像URLをアプリ上で表示できるようになるかを調べたので、今後の自分への忘備録として記しておこうと思います。

今回は執筆時点のバージョンが2.2.2Coilライブラリを使用した場合の解説となりますので、あらかじめご了承ください。

画像を読み込むために必要なライブラリのインポート

外部URLに存在する画像を読み取るためには、Coilライブラリが必要になります。

implementation("io.coil-kt:coil:2.2.2")

続いて、Jetpack ComposeにてCoilを使いたいので、次のライブラリをインポートします。

implementation("io.coil-kt:coil-compose:2.2.2")

これで、画像URLを読み込むために必要な準備は整いました。

雛形のコンポーザブルを作成する

では、実際にImageコンポーザブルで読み込んだ画像URLを表示するようにしていきたいのですが、なにもないとイメージがわかないと思うので、次のようなコンポーザブルを作成しました。

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun MemberListItem(
    name: String,
    group: String,
    checked: Boolean = false,
    enabled: Boolean = true,
    onClick: () -> Unit = {}
) {
    ListItem(
        modifier = Modifier
            .clickable {
                if (enabled) {
                    onClick()
                }
            },
        leadingContent = {
            Box(
                modifier = Modifier
                    .size(48.dp)
                    .clip(RoundedCornerShape(100))
                    .background(MaterialTheme.colorScheme.surfaceVariant)
            )
        },
        headlineText = {
            Text("$name")
        },
        supportingText = {
            Row {
                Text("$group")
            }
        },
        trailingContent = {
            if (checked) {
                Icon(
                    Icons.Outlined.Check,
                    contentDescription = null,
                    tint = MaterialTheme.colorScheme.primary
                )
            } else {
                Icon(
                    Icons.Outlined.Close,
                    contentDescription = null,
                    tint = MaterialTheme.colorScheme.error
                )
            }
        }
    )
}

これをレンダリングした状態は次のようになります。

名称未設定のデザイン (26).png

URLの画像をImageコンポーザブルで表示する

上記の画像の、丸いアイコンの部分に画像を表示させたいと思います。
もし、URLが渡されなかった場合は今まで通りBoxコンポーザブルを表示することとします。

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun MemberListItem(
    imageUrl: String? = null,
    name: String,
    group: String,
    checked: Boolean = false,
    enabled: Boolean = true,
    onClick: () -> Unit = {}
) {
    ListItem(
        modifier = Modifier
            .clickable {
                if (enabled) {
                    onClick()
                }
            },
        leadingContent = {
            if (imageUrl == null || imageUrl == "") {
                Box(
                    modifier = Modifier
                        .size(48.dp)
                        .clip(RoundedCornerShape(100))
                        .background(MaterialTheme.colorScheme.surfaceVariant)
                )
            } else {
                Image(
                    painter = rememberAsyncImagePainter(imageUrl),
                    contentDescription = null,
                    modifier = Modifier
                        .size(48.dp)
                        .clip(RoundedCornerShape(100)),
                    contentScale = ContentScale.Crop
                )
            }
        },
        headlineText = {
            Text("$name")
        },
        supportingText = {
            Row {
                Text("$group")
            }
        },
        trailingContent = {
            if (checked) {
                Icon(
                    Icons.Outlined.Check,
                    contentDescription = null,
                    tint = MaterialTheme.colorScheme.primary
                )
            } else {
                Icon(
                    Icons.Outlined.Close,
                    contentDescription = null,
                    tint = MaterialTheme.colorScheme.error
                )
            }
        }
    )
}

注目すべき部分は、Imageコンポーザブルのpainter引数に渡している部分です。

ローカルに保存されている画像リソースを表示させたい場合は次のようにしていたと思います。

Image(
    painter = painterResource(imageResourceId),
    ...
)

ですが、Coilを使って画像URLを表示させたい場合には、rememberAsyncImagePainter()を使います。

Image(
    painter = rememberAsyncImagePainter(imageUrl),
    ...
)

実際に画像が表示された状態が次のものになります。

名称未設定のデザイン (27).png

まとめ

Jetpack ComposeではMaterial3のListItemコンポーザブルが提供されており、引数にコンポーザブルを渡すだけで、簡単にリストの要素を構築することができるようになっています。

今まで既存の画像リソースのみを表示することに徹していて、そろそろ画像URLを表示してみたいなと思っていた方は是非Coilを使って実際に画像URLを表示させてみてください。とても簡単です。

参考にした記事

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?