- При использовании пользовательского интерфейса, полностью основанного на Compose, переключение между компонентами TextField работает должным образом. Клавиатура остается открытой при навигации между текстовыми полями, что является желаемым поведением.
- Однако, когда я использую гибридный подход (сочетание XML и Compose), клавиатура ведет себя по-другому. В частности, при переключении между компонентами TextField клавиатура закрывается и снова открывается, что нежелательно.
Вот ключевые вопросы, которые у меня возникают:
- Почему такое поведение происходит в гибридной версии подход, но не полностью основанный на Compose?
- LКак обеспечить, чтобы клавиатура оставалась открытой при переключении между текстовыми полями в гибридной настройке XML + Compose?
Код: Выделить всё
class MainActivity : ComponentActivity() {
private lateinit var binding: MainActivityBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
// binding = MainActivityBinding.inflate(layoutInflater)
// setContentView(binding.root)
// binding.firstComposeView.setContent {
// BasicTextFieldExample(PaddingValues(20.dp))
// }
// binding.secondComposeView.setContent {
// BasicTextFieldExample(PaddingValues(20.dp))
// }
setContent {
BasicTextFieldExampleTheme {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
Column(
Modifier.fillMaxSize()
) {
BasicTextFieldExample(PaddingValues(20.dp))
Spacer(Modifier.height(100.dp))
BasicTextFieldExample(innerPadding)
}
}
}
}
}
}
@OptIn(ExperimentalFoundationApi::class)
@Composable
fun BasicTextFieldExample(innerPadding: PaddingValues) {
val state = rememberTextFieldState()
val interactionSource = remember { MutableInteractionSource() }
val basicTextFieldViewState by remember {
mutableStateOf(
BasicTextFieldViewState(
inputTransformation = InputTransformation.maxLength(12)
.then(DigitsOnlyTransformation),
outputTransformation = GroupingOutputTransformation(4, "-"),
lineLimits = TextFieldLineLimits.SingleLine
)
)
}
BasicTextFieldView(
modifier = Modifier
.padding(innerPadding)
.wrapContentSize(),
state = state,
interactionSource = interactionSource,
basicTextFieldViewState = basicTextFieldViewState,
prefix = {
Text(
"Abc-"
)
}
)
}
data class BasicTextFieldViewState(
val inputTransformation: InputTransformation? = null,
val outputTransformation: OutputTransformation? = null,
val isEnabled: Boolean = true,
val isError: Boolean = false,
val lineLimits: TextFieldLineLimits,
)
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun BasicTextFieldView(
modifier: Modifier,
state: TextFieldState,
interactionSource: MutableInteractionSource,
basicTextFieldViewState: BasicTextFieldViewState,
prefix: @Composable () -> Unit,
) {
Column(modifier) {
BasicTextField(
state = state,
modifier = Modifier
.fillMaxWidth()
.padding(20.dp),
interactionSource = interactionSource,
inputTransformation = basicTextFieldViewState.inputTransformation,
outputTransformation = basicTextFieldViewState.outputTransformation,
enabled = basicTextFieldViewState.isEnabled,
lineLimits = TextFieldLineLimits.SingleLine,
textStyle = LocalTextStyle.current,
decorator = TextFieldDefaults.decorator(
state = state,
outputTransformation = basicTextFieldViewState.outputTransformation,
lineLimits = basicTextFieldViewState.lineLimits,
enabled = basicTextFieldViewState.isEnabled,
label = {
Text(
"Label"
)
},
isError = basicTextFieldViewState.isError,
interactionSource = interactionSource,
prefix = prefix,
placeholder = {
Text(
"Number"
)
},
)
)
}
}
object DigitsOnlyTransformation : InputTransformation {
override val keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number)
override fun TextFieldBuffer.transformInput() {
if (!asCharSequence().isDigitsOnly()) {
revertAllChanges()
}
}
}
@Stable
data class GroupingOutputTransformation(
private val groupSize: Int,
private val groupDelimiter: String,
) : OutputTransformation {
override fun TextFieldBuffer.transformOutput() {
repeat((length - 1) / groupSize) {
insert(it + (it + 1) * groupSize, groupDelimiter)
}
}
}
Фактический результат: YouTube
Подробнее здесь: https://stackoverflow.com/questions/793 ... ck-compose