Jetpack Compose: отключить взаимодействие с TextField

Есть ли способ отключить все взаимодействия для TextField Jetpack Compose?

3 ответа

Решение

С 1.0.0-beta02 вы можете использовать <strong></strong> атрибут:

enabled : контролирует включенное состояние TextField. Когда false, текстовое поле не будет ни редактируемым, ни фокусируемым, ввод текстового поля не будет выбираться, визуально текстовое поле будет отображаться в отключенном состоянии пользовательского интерфейса

Что-то вроде:

      var text by rememberSaveable { mutableStateOf("Text") }

TextField(
    value = text,
    onValueChange = { text = it },
    enabled = false,
    label = { Text("Label") },
    singleLine = true
)

Мой проект включен alpha08атм. Надеюсь, они скоро добавят какой-нибудь встроенный способ сделать это, но пока что я делал это:

      val textState = remember { mutableStateOf(TextFieldValue()) }
val disabled = remember { mutableStateOf(true) }
Box {
  TextField(value = textState.value, onValueChange = {
    textState.value = it
  })
  if (disabled.value) {
    // Set alpha(0f) to hide click animation
    Box(modifier = Modifier.matchParentSize().alpha(0f).clickable(onClick = {}))
  }
}

Итак, да, рисование невидимого интерактивного окна такого же размера над TextField. Вы можете изменить размер TextField на любое желаемое, вызвав .matchParentSize() на невидимом поле будет соответствовать текстовому полю, поскольку они являются единственными дочерними элементами в родительском поле.

Вы можете переключить отключенное состояние, установив disabled.value = true/false везде, где это уместно.

readOnlyАтрибут также может работать в случае, если вам нужно фокусируемое и выбираемое текстовое поле, но не редактируемое.

Так:

         var value by remember { mutableStateOf("Hello World!") }

    TextField(
        value = value,
        onValueChange = { value = it },
        readOnly = true,
    )