22

Is there a way to disable all interaction for Jetpack Compose's TextField?

2

3 Answers 3

27

You can use the enabled attribute:

enabled : controls the enabled state of the TextField. When false, the text field will be neither editable nor focusable, the input of the text field will not be selectable, visually text field will appear in the disabled UI state

Something like:

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

TextField(
    value = text,
    onValueChange = { text = it },
    enabled = false,
    label = { Text("Label") },
    singleLine = true
)
Sign up to request clarification or add additional context in comments.

3 Comments

enabled will not act on disabledTextColor, is there a way to solve it?
Do you know some way to make TextField editable and focusable but not selectable?
To make text non-selectable, wrap the components within DisableSelection { ... }
12

My project is on alpha08 atm. Hopefully they add some built in way of doing this soon but in the meantime I've been doing this:

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 = {}))
  }
}

So yeah, drawing an invisible clickable Box that's the same size over the TextField. You can resize the TextField to whatever you'd want, calling .matchParentSize() on the invisible Box will make it match the TextField due to them being the only children in the parent Box.

You can toggle the disabled state by setting disabled.value = true/false wherever is appropriate.

Comments

9

readOnly attribute can also work in case if you want focusable & selectable text field but not editable.

Like this:

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

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

1 Comment

readOnly = true, hides the caret and this is not desirable.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.