Jetpack Composeについて
【主なJetpack Composeによる画面の部品の関数】
・Surface ……Surface等で囲まないとダーク テーマで白文字に成らなかったり、ライト テーマで白背景に成らなかったりします。
・Column ……縦に並べてくれます。例えば、modifier = Modifier.verticalScroll(rememberScrollState())を設定すると縦スクロールできます。
・Row ……横に並べてくれます。
・Spacer ……縦や横の余白を作ってくれます。例えば、Spacer(Modifier.size(20.dp))とすると、20dpの余白を作ってくれます。
・Text ……文字を表示してくれます。いわゆる、ラベルです。
・Button ……ボタンを表示してくれます。
・OutlinedTextField ……テキスト ボックスを表示してくれます。
・TextField ……テキスト ボックスを表示してくれます。
・BoxとButton等とDropdownMenuとDropdownMenuItem ……メニュー項目やリスト ボックス?を表示してくれます。
・HorizontalDivider ……水平線を表示してくれます。
・VerticalDivider ……垂直線を表示してくれます。
Jetpack Composeは、Surface等の中で、ColumnとRowを組み合わせて、画面の部品を配置します。
BoxとButtonとDropdownMenuとDropdownMenuItemの例
――――――――――――――――――――――――――――――
var xxxExpanded by rememberSaveable { mutableStateOf(false) }
var xxx by rememberSaveable { mutableStateOf("デフォルト値") }
//中略
Box {
Button(
onClick = {
xxxExpanded = ! xxxExpanded
}
) {
Text(xxxLabel)
}
DropdownMenu(
expanded = xxxExpanded,
onDismissRequest = { xxxExpanded = false }
) {
DropdownMenuItem(
text = { Text(text = "選択肢1") },
onClick = {
xxxExpanded = false
xxx = "選択肢1の値"
}
)
DropdownMenuItem(
text = { Text(text = "選択肢2") },
onClick = {
xxxExpanded = false
xxx = "選択肢2の値"
}
)
}
}
――――――――――――――――――――――――――――――
ジェットパック コンポーズでは、今までのアンドロイド ビューのSAF(ストレージ アクセス フレームワーク)のコードをrememberLauncherForActivityResultで書き換える必要が有ります。
ちなみに、rememberLauncherForActivityResultで権限の確認もできるそう?です。
ジェットパック コンポーズのSAF(ストレージ アクセス フレームワーク)の例
――――――――――――――――――――――――――――――
val context = LocalContext.current
var text by rememberSaveable { mutableStateOf("") }
val readRememberLauncherForActivityResult = rememberLauncherForActivityResult(ActivityResultContracts.GetContent()) { uri ->
if (uri == null) {
return@rememberLauncherForActivityResult
}
InputStreamReader(context.contentResolver.openInputStream(uri!!), characterCodeName).use {
text = it.readText()
}
}
val saveRememberLauncherForActivityResult = rememberLauncherForActivityResult(ActivityResultContracts.CreateDocument()) { uri ->
if (uri == null) {
return@rememberLauncherForActivityResult
}
//contentResolver.openOutputStream()で"wt"モードを指定しないと、書き込み前のテキストの文字数が大きい場合、書き込み前のテキストの先頭の一部を置換するような形に成ってしまいます。
OutputStreamWriter(context.contentResolver.openOutputStream(uri!!, "wt"), characterCodeName).use {
BufferedWriter(it).use {
it.write(text)
}
}
}
//中略
Row {
Button(
onClick = {
readRememberLauncherForActivityResult.launch("*/*")
}
) {
Text("ファイル読み込み")
}
}
Row {
Button(
onClick = {
saveRememberLauncherForActivityResult.launch("")
}
) {
Text("ファイル保存")
}
}
//以下略
――――――――――――――――――――――――――――――
※前記の中の「*/*」はMIMEタイプです。画像ファイルだけを読み書きする場合は「image/*」のようにMIMEタイプを指定します。




