Jetpack Composeでプロフィール画面を構築する

Jetpack Composeを使って、ユーザーのプロフィール情報を表示・編集できるUIを実装します。アバター画像の選択と永続化も含みます。

プロジェクトのセットアップ

Android Studioが最新版であることを確認し、新規Composeプロジェクトを作成します。必要な依存関係をbuild.gradleに追加:

dependencies {
    implementation "androidx.compose.ui:ui:1.6.0"
    implementation "androidx.compose.material3:material3:1.2.0"
    implementation "androidx.activity:activity-compose:1.8.0"
    implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.7.0"
}

プロフィールUIの構築

円形のアバター、ユーザー名、メールアドレス、編集ボタンを中央揃えで配置します。

@Composable
fun ProfileCard(profile: UserProfile) {
    Box(
        modifier = Modifier
            .fillMaxWidth()
            .padding(24.dp)
    ) {
        Column(
            horizontalAlignment = Alignment.CenterHorizontally,
            verticalArrangement = Arrangement.Center
        ) {
            AvatarDisplay(profile.avatarUri)
            Spacer(Modifier.height(12.dp))
            Text(profile.displayName, style = MaterialTheme.typography.titleLarge)
            Spacer(Modifier.height(4.dp))
            Text(profile.contactEmail, style = MaterialTheme.typography.bodyMedium)
            Spacer(Modifier.height(20.dp))
            ElevatedButton(onClick = { /* プロフィール編集画面へ */ }) {
                Text("プロフィールを編集")
            }
        }
    }
}

@Composable
private fun AvatarDisplay(uri: String?) {
    val painter = rememberAsyncImagePainter(
        model = ImageRequest.Builder(LocalContext.current)
            .data(uri ?: R.drawable.placeholder_avatar)
            .build()
    )
    Image(
        painter = painter,
        contentDescription = "User avatar",
        modifier = Modifier
            .size(100.dp)
            .clip(RoundedCornerShape(50.dp))
            .border(2.dp, Color.Gray, RoundedCornerShape(50.dp))
    )
}

画像選択と保存機能

ギャラリーから画像を選択し、URIをSharedPreferencesに保存します。

@Composable
fun AvatarPicker(updateAvatar: (String) -> Unit) {
    val context = LocalContext.current
    val picker = rememberLauncherForActivityResult(
        contract = ActivityResultContracts.GetContent()
    ) { selectedUri ->
        selectedUri?.toString()?.let(updateAvatar)
    }

    OutlinedButton(
        onClick = { picker.launch("image/*") },
        modifier = Modifier.padding(top = 8.dp)
    ) {
        Text("アバターを変更")
    }
}

// 保存処理
fun saveAvatarUri(context: Context, uri: String) {
    context.getSharedPreferences("UserPrefs", Context.MODE_PRIVATE)
        .edit()
        .putString("saved_avatar", uri)
        .apply()
}

// 読み込み処理
fun loadAvatarUri(context: Context): String? {
    return context.getSharedPreferences("UserPrefs", Context.MODE_PRIVATE)
        .getString("saved_avatar", null)
}

タグ: JetpackCompose AndroidUI Material3 SharedPreferences ImagePicker

7月27日 02:46 投稿