# SoftwareKeyboardController

Artifact: [androidx.compose.ui:ui](https://developer.android.com/jetpack/androidx/releases/compose-ui) [View Source](https://cs.android.com/search?q=file:androidx/compose/ui/platform/SoftwareKeyboardController.kt+class:androidx.compose.ui.platform.SoftwareKeyboardController) Added in [1.0.0](https://developer.android.com/jetpack/androidx/releases/compose-ui#1.0.0) Common/AllAndroid/JVM
- Cmn

  ```
  interface SoftwareKeyboardController
  ```

*** ** * ** ***

Provides manual, programmatic control over the software keyboard.

Obtain an instance using `https://developer.android.com/reference/kotlin/androidx/compose/ui/platform/package-summary#LocalSoftwareKeyboardController()`. It is commonly used to programmatically hide the keyboard (e.g., after submitting data to a network, or when executing custom done/search actions).

```kotlin
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.text.BasicTextField
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.text.input.rememberTextFieldState
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.unit.dp

val keyboardController = LocalSoftwareKeyboardController.current

// used to ensure a TextField is focused when showing keyboard
val focusRequester = remember { FocusRequester() }
val state = rememberTextFieldState("Close keyboard on done ime action (blue ✔️)")
Column(Modifier.padding(16.dp)) {
    BasicTextField(
        state,
        keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
        onKeyboardAction = { keyboardController?.hide() },
        modifier = Modifier.focusRequester(focusRequester).fillMaxWidth(),
    )
    Spacer(Modifier.height(16.dp))
    Button(
        onClick = {
            focusRequester.requestFocus()
            keyboardController?.show()
        },
        modifier = Modifier.fillMaxWidth(),
    ) {
        Text("Show software keyboard.")
    }
}
```

## Summary

| ### Public functions |
|---|---|---|
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/compose/ui/platform/SoftwareKeyboardController#hide()()` Hide the software keyboard. | Cmn |
| `https://kotlinlang.org/api/core/kotlin-stdlib/kotlin/-unit/index.html` | `https://developer.android.com/reference/kotlin/androidx/compose/ui/platform/SoftwareKeyboardController#show()()` Request that the system show a software keyboard. | Cmn |

## Public functions

### hide

Cmn Added in [1.0.0](https://developer.android.com/jetpack/androidx/releases/compose-ui#1.0.0)

```
fun hide(): Unit
```

Hide the software keyboard.

This request is best effort, if the system cannot hide the software keyboard this call will silently be ignored.

Calling this function is considered a side-effect and should not be called directly from recomposition.

```kotlin
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.text.BasicTextField
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.text.input.rememberTextFieldState
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.unit.dp

val keyboardController = LocalSoftwareKeyboardController.current

// used to ensure a TextField is focused when showing keyboard
val focusRequester = remember { FocusRequester() }
val state = rememberTextFieldState("Close keyboard on done ime action (blue ✔️)")
Column(Modifier.padding(16.dp)) {
    BasicTextField(
        state,
        keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
        onKeyboardAction = { keyboardController?.hide() },
        modifier = Modifier.focusRequester(focusRequester).fillMaxWidth(),
    )
    Spacer(Modifier.height(16.dp))
    Button(
        onClick = {
            focusRequester.requestFocus()
            keyboardController?.show()
        },
        modifier = Modifier.fillMaxWidth(),
    ) {
        Text("Show software keyboard.")
    }
}
```

### show

Cmn Added in [1.0.0](https://developer.android.com/jetpack/androidx/releases/compose-ui#1.0.0)

```
fun show(): Unit
```

Request that the system show a software keyboard.

This request is best effort. If the system can currently show a software keyboard, it will be shown. However, there is no guarantee that the system will be able to show a software keyboard. If the system cannot show a software keyboard currently, this call will be silently ignored.

The software keyboard will never show if there is no composable that will accept text input, such as a `https://developer.android.com/reference/kotlin/androidx/compose/foundation/text/BasicTextField.composable#BasicTextField(androidx.compose.foundation.text.input.TextFieldState,androidx.compose.ui.Modifier,kotlin.Boolean,kotlin.Boolean,androidx.compose.foundation.text.input.InputTransformation,androidx.compose.ui.text.TextStyle,androidx.compose.foundation.text.KeyboardOptions,androidx.compose.foundation.text.input.KeyboardActionHandler,androidx.compose.foundation.text.input.TextFieldLineLimits,kotlin.Function2,androidx.compose.foundation.interaction.MutableInteractionSource,androidx.compose.ui.graphics.Brush,androidx.compose.foundation.text.input.OutputTransformation,androidx.compose.foundation.text.input.TextFieldDecorator,androidx.compose.foundation.ScrollState)` when it is focused. You may find it useful to ensure focus when calling this function.

You do not need to call this function unless you also call `https://developer.android.com/reference/kotlin/androidx/compose/ui/platform/SoftwareKeyboardController#hide()`, as the keyboard is automatically shown and hidden by focus events in the BasicTextField.

Calling this function is considered a side-effect and should not be called directly from recomposition.

```kotlin
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.text.BasicTextField
import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.text.input.rememberTextFieldState
import androidx.compose.material3.Button
import androidx.compose.material3.Text
import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.focusRequester
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.unit.dp

val keyboardController = LocalSoftwareKeyboardController.current

// used to ensure a TextField is focused when showing keyboard
val focusRequester = remember { FocusRequester() }
val state = rememberTextFieldState("Close keyboard on done ime action (blue ✔️)")
Column(Modifier.padding(16.dp)) {
    BasicTextField(
        state,
        keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done),
        onKeyboardAction = { keyboardController?.hide() },
        modifier = Modifier.focusRequester(focusRequester).fillMaxWidth(),
    )
    Spacer(Modifier.height(16.dp))
    Button(
        onClick = {
            focusRequester.requestFocus()
            keyboardController?.show()
        },
        modifier = Modifier.fillMaxWidth(),
    ) {
        Text("Show software keyboard.")
    }
}
```