#kotlin #android-jetpack-compose
#kotlin #android-jetpack-compose
Вопрос:
Я не уверен, что это ошибка в FocusManager, TextField или что-то еще. Если я попытаюсь установить значение текстового поля и одновременно очистить фокус текстового поля (т. Е. Одним нажатием кнопки), установка значения текстового поля не будет работать.
В следующем коде после того, как я ввожу что-то в текстовое поле, нажатие кнопки «сброс и очистка» только удаляет фокус из текстового поля, но значение текстового поля не изменяется. Если я нажму на кнопку еще раз, это изменит значение текстового поля. Мне кажется, я могу сделать что-то одно, но не оба одновременно.
P.S. Добавьте задержку прямо перед тем, как clearFocus заставит ее работать, конечно, тогда вся лямбда-кодировка должна быть заключена в запуск области видимости.
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
MyApplicationTheme {
// A surface container using the 'background' color from the theme
Surface(color = MaterialTheme.colors.background) {
ResetAndClearTextField()
}
}
}
}
}
@Composable
private fun ResetAndClearTextField() {
val (textFieldValue, setTextFieldValue) = remember { mutableStateOf(
TextFieldValue("")
) }
val focusManager = LocalFocusManager.current
Column {
TextField(
value = textFieldValue,
onValueChange = setTextFieldValue
)
Button(onClick = {
setTextFieldValue(TextFieldValue(""))
focusManager.clearFocus()
}) {
Text("reset and clear")
}
}
}
проект build.gradle
buildscript {
ext {
compose_version = '1.0.1'
}
repositories {
google()
mavenCentral()
}
dependencies {
classpath "com.android.tools.build:gradle:7.0.4"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.21"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
сборка приложения.gradle
plugins {
id 'com.android.application'
id 'kotlin-android'
}
android {
compileSdk 31
defaultConfig {
applicationId "com.testing.myapplication"
minSdk 26
targetSdk 31
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables {
useSupportLibrary true
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
useIR = true
}
buildFeatures {
compose true
}
composeOptions {
kotlinCompilerExtensionVersion compose_version
kotlinCompilerVersion '1.5.21'
}
packagingOptions {
resources {
excludes = '/META-INF/{AL2.0,LGPL2.1}'
}
}
}
dependencies {
implementation 'androidx.core:core-ktx:1.7.0'
implementation 'androidx.appcompat:appcompat:1.4.0'
implementation 'com.google.android.material:material:1.4.0'
implementation "androidx.compose.ui:ui:$compose_version"
implementation "androidx.compose.material:material:$compose_version"
implementation "androidx.compose.ui:ui-tooling-preview:$compose_version"
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.0'
implementation 'androidx.activity:activity-compose:1.4.0'
testImplementation 'junit:junit:4. '
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_version"
debugImplementation "androidx.compose.ui:ui-tooling:$compose_version"
}
Комментарии:
1. У меня работает тот же код. Можете ли вы проверить, связана ли проблема с каким-либо другим кодом? Попробуйте этот компонент в новом проекте.
2. Возможно, это может пролить некоторый свет: codepen.io/chrisza/pen/jOGrWwK
3. Абхиманью, я думал, что это эмулятор, но это не так. Я создал новый API эмулятора 30 Pixel 4XL. Я также попробовал реальное устройство Pixel 3 Android 12. Произошло то же самое. Теперь я включил в вопрос все свои файлы gradle и окружающий код.
Ответ №1:
Я обнаружил, что использование области видимости для переноса на самом focusManager.clearFocus()
деле не помогло решить проблему. Это вообще не очищает фокус, но все равно будет учитывать setTextFieldValue(TextFieldValue(""))
Реальный обходной путь — перевернуть строку, поэтому очистите фокус перед установкой TextFieldValue.
focusManager.clearFocus()
setTextFieldValue(TextFieldValue(""))