Material Design 3 で Jetpack Compose チュートリアル をやってみたところ、何点かエラーになったところがあったので記録として残しておきます。
環境
Android Studio Chipmunk | 2021.2.1 Patch 1
![](https://apprythm.com/wp-content/uploads/2022/06/jetpack_material3_android_studio-1024x651.png)
手順
Android Studio で新規プロジェクト作成時に Empty Compose Activity (Material3) を選択します。
![](https://apprythm.com/wp-content/uploads/2022/06/jetpack_material3_select-1024x717.png)
![](https://apprythm.com/wp-content/uploads/2022/06/jetpack_material3_create-1024x795.png)
以降は基本的に チュートリアル 通りに進めますが、注意が必要な点だけまとめます。
Javaのバージョン
プレビューを見るには「Build & Refresh」というボタンをクリックするのですが、このときに
Android Gradle plugin requires Java 11 to run. You are currently using Java 1.8.
というエラーが表示されてしまいます。
![](https://apprythm.com/wp-content/uploads/2022/06/jetpack_material3_java_error-1024x852.png)
Java のバージョンが違うということなので、上部メニューから
Android Studio > Preferences... > Build, Execution, Development > Build Tools > Gradle
と進み、Gradle JDK のところを 11 とします。
![](https://apprythm.com/wp-content/uploads/2022/06/jetpack_material3_java_setting-1024x757.png)
gradle ファイルの dependencies
マウスカーソルを合わせて、推奨されるバージョンに変えていきます。
$compose_version
という変数を参照している部分は、プロジェクトの gradle ファイルの compose_version
になるので、ここを 1.1.1
とします。
併せて、org.jetbrains.kotlin.android
のバージョンも 1.6.10
に変えておきます。
buildscript {
ext {
compose_version = '1.1.1'
}
}// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
id 'com.android.application' version '7.2.1' apply false
id 'com.android.library' version '7.2.1' apply false
id 'org.jetbrains.kotlin.android' version '1.6.10' apply false
}
(以下略)
MaterialTheme.colors
MaterialTheme.colors
となっている部分は MaterialTheme.colorScheme
と置き換えます。
また secondaryVariant
も存在しないので、サジェストされる適当なものに置き換えてください。
MaterialTheme.typography
MaterialTheme.typography
についても値が変わっているので注意です。
私は subtitle2
を headlineMedium
に、body2
を bodyMedium
にしました。
エミュレータでの実行
エミュレータでの実行手順もついでに書いておきます。
プレビューの右上にあるボタンをクリックします。
![](https://apprythm.com/wp-content/uploads/2022/06/jetpack_material3_run-1024x344.png)
「Device Manager」をクリックすると、デバイスの一覧が表示されます。
![](https://apprythm.com/wp-content/uploads/2022/06/jetpack_material3_device_manager-1024x184.png)
好きなデバイスを選択して実行できます。
デバイスがない場合は、「Create device」ボタンから作成できます。
![](https://apprythm.com/wp-content/uploads/2022/06/jetpack_material3_device_list-1024x288.png)
最終的なコード
最終的なコードも載せておきます。
package com.example.composetutorial
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.animation.animateColorAsState
import androidx.compose.animation.animateContentSize
import androidx.compose.foundation.Image
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.example.composetutorial.ui.theme.ComposeTutorialTheme
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
ComposeTutorialTheme {
MessageCard(Message("Android", "Jetpack Compose"))
}
}
}
}
data class Message(val author: String, val body: String)
@Composable
fun Conversation(messages: List<Message>) {
LazyColumn {
items(messages) { message ->
MessageCard(message)
}
}
}
@Composable
fun MessageCard(msg: Message) {
Row(modifier = Modifier.padding(all = 8.dp)) {
Image(
painter = painterResource(id = R.drawable.sample_image1),
contentDescription = "Sample Image",
modifier = Modifier
.size(40.dp)
.clip(CircleShape)
.border(1.5.dp, MaterialTheme.colorScheme.secondary, CircleShape)
)
Spacer(modifier = Modifier.width(8.dp))
var isExpanded by remember { mutableStateOf(false) }
val surfaceColor by animateColorAsState(
if (isExpanded) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.surface,
)
Column (modifier = Modifier.clickable { isExpanded = !isExpanded }) {
Text(
text = msg.author,
color = MaterialTheme.colorScheme.secondaryContainer,
style = MaterialTheme.typography.headlineMedium
)
Spacer(modifier = Modifier.height(4.dp))
Surface(
shape = MaterialTheme.shapes.medium,
shadowElevation = 1.dp,
color = surfaceColor,
modifier = Modifier
.animateContentSize()
.padding(1.dp)
) {
Text(
text = msg.body,
modifier = Modifier.padding(all = 4.dp),
maxLines = if (isExpanded) Int.MAX_VALUE else 1,
style = MaterialTheme.typography.bodyMedium
)
}
}
}
}
@Preview(name = "Light Mode")
//@Preview(
// uiMode = Configuration.UI_MODE_NIGHT_YES,
// showBackground = true,
// name = "Dark Mode"
//)
@Composable
fun PreviewMessageCard() {
ComposeTutorialTheme {
Conversation(SampleData.conversationSample)
}
}