たくさんの自由帳
Androidのお話
たくさんの自由帳
投稿日 : | 0 日前
文字数(だいたい) : 2693
どうもこんばんわ。
自分用メモ。あの文字入力中のカーソル?点滅してるやつってキャレットって言うらしいですよ?
Jetpack Compose でテキストフィールドのカーソルの位置はどこで変更できるの
String
ではなくTextFieldValue
を引数に取るTextField
を利用すると、
TextFieldValue
経由でカーソルの位置を変更できます。
ただこれを利用すると、カーソルを動かすたびにonValueChange = { }
が呼ばれるので、
今まで通りに文字変更時だけ呼ばれるようにしたい場合はLaunchedEffect
のkey
に入れれば良いんじゃないかと思いました。
検索であるサジェスト(テキスト補充のやつ)とかで使えるんじゃないかと思いました
class MainActivity : ComponentActivity() {
private val ALL_LIST = listOf(
"Android 12",
"Android 13 DP",
"Android JetpackCompose",
"Android Room",
"Android LiveData",
"Android ViewModel",
)
@OptIn(ExperimentalMaterialApi::class)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
TextFieldCursorPosTheme {
// A surface container using the 'background' color from the theme
Surface(modifier = Modifier.fillMaxSize(), color = MaterialTheme.colors.background) {
// サジェスト一覧
val suggestList = remember { mutableStateListOf<String>() }
// 入力欄の文字
val textFieldValue = remember { mutableStateOf(TextFieldValue()) }
// 文字だけ変更検知
LaunchedEffect(key1 = textFieldValue.value.text, block = {
suggestList.clear()
suggestList.addAll(ALL_LIST.filter { it.contains(textFieldValue.value.text) })
})
Column(modifier = Modifier.padding(10.dp)) {
OutlinedTextField(
value = textFieldValue.value,
onValueChange = { textFieldValue.value = it }
)
LazyColumn(content = {
items(suggestList) { suggestText ->
Surface(
onClick = {
textFieldValue.value = textFieldValue.value.copy(
text = suggestText,
selection = TextRange(suggestText.length) // 押したらカーソルを最後に移動
)
}
) { Text(modifier = Modifier.padding(10.dp), text = suggestText) }
}
})
}
}
}
}
}
}
おいておきます
https://github.com/takusan23/TextFieldCursorPos
花粉やばい