Неожиданная проблема с клавиатурой. Открытие и закрытие в режиме создания реактивного ранца.Android

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Неожиданная проблема с клавиатурой. Открытие и закрытие в режиме создания реактивного ранца.

Сообщение Anonymous »

Я столкнулся с проблемой с поведением клавиатуры в Jetpack Compose. Вот сценарий:
  • При использовании пользовательского интерфейса, полностью основанного на Compose, переключение между компонентами TextField работает должным образом. Клавиатура остается открытой при навигации между текстовыми полями, что является желаемым поведением.
  • Однако, когда я использую гибридный подход (сочетание XML и Compose), клавиатура ведет себя по-другому. В частности, при переключении между компонентами TextField клавиатура закрывается и снова открывается, что нежелательно.
Я подозреваю, что это может быть связано с тем, как обрабатывается фокус между Слои XML и Compose.
Вот ключевые вопросы, которые у меня возникают:
  • Почему такое поведение происходит в гибридной версии подход, но не полностью основанный на 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
Фактический результат: YouTube

Подробнее здесь: https://stackoverflow.com/questions/793 ... ck-compose
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»