我有这样的用户界面:
val scrollState = rememberScrollState()
Column(
modifier = Modifier
.fillMaxSize(1F)
.padding(horizontal = 16.dp)
.verticalScroll(scrollState)
) {
TextField(...)
// multiple textfields
TextField(
//...
modifier = Modifier.focusOrder(countryFocus).onFocusChanged {
if(it == FocusState.Active) {
// scroll to this textfield
}
},
)
}
Run Code Online (Sandbox Code Playgroud)
我在此列中有多个 TextFields,当其中一个聚焦时,我想将 Column 滚动到它。scrollState 中有一个方法,scrollState.smoothScrollTo(0f)但我不知道如何获得聚焦的 TextField 位置。
更新:
看来我找到了一个可行的解决方案。我用过onGloballyPositioned并且有效。但我不确定这是否是解决此问题的最佳方法。
var scrollToPosition = 0.0F
TextField(
modifier = Modifier
.focusOrder(countryFocus)
.onGloballyPositioned { coordinates ->
scrollToPosition = scrollState.value + coordinates.positionInRoot().y
}
.onFocusChanged {
if (it == FocusState.Active) {
scope.launch { …Run Code Online (Sandbox Code Playgroud) 我Scaffold在主屏幕上使用了一个bottomBar在应用程序的每个屏幕中都可见的固定屏幕,并且我将 的 应用于innerPadding其Scaffold内容。
我希望键盘出现在 之上bottomBar,为此我将imePadding()only应用于Scaffold应用于的内容。
但是,当键盘打开时,Scaffold和innerPadingimePadding()都会应用于内容填充。
我尝试过伴奏插入迁移,但并不幸运。
无论如何,我可以阻止它并仅应用其中之一吗?
这是我的一段代码:
Scaffold(
topBar = { },
bottomBar = { },
modifier = Modifier
.systemBarsPadding()
) { innerPadding ->
Content(
modifier = Modifier
.padding(innerPadding)
.imePadding()
)
}
Run Code Online (Sandbox Code Playgroud)
这是结果:
对于现在已弃用的伴奏插图,我使用了以下解决方案:
val isImeVisible = LocalWindowInsets.current.ime.isVisible
val contentPadding = remember(isImeVisible) {
if (isImeVisible) PaddingValues(top = innerPadding.calculateTopPadding()) else innerPadding
}
Run Code Online (Sandbox Code Playgroud) windowinsets android-jetpack-compose jetpack-compose-accompanist
由于我们有不同的屏幕尺寸和分辨率,我想在展开的键盘顶部放置一个可组合项:
键盘(见上图)是可见的,我想显示另一个可组合项(红色方块),例如消息几秒钟。
使用 Jetpack Compose 定位红色可组合项的简单方法是什么?
我正在尝试积极观察软键盘的可见性,目前,我正在尝试使用
WindowInsets.isImeVisible
Run Code Online (Sandbox Code Playgroud)
但我似乎无法观察到它的状态变化。有人提到使用
ViewCompat.setOnApplyWindowInsetsListener()
Run Code Online (Sandbox Code Playgroud)
但我不太明白如何实现这个来观察键盘的可见性。
我已经设法使用
WindowInsets.isImeVisible
Run Code Online (Sandbox Code Playgroud)
但是,它仅适用于我导航到该页面并且键盘自动打开时。
android android-softkeyboard kotlin android-jetpack-compose compose-recomposition
键盘打开时是否可以拦截后退按钮?使用 EditText 可以,如此处的答案所示,Compose 也可以吗?
我有一个Search可组合项,它在 300 毫秒去抖后调用搜索,当我单击后退按钮时,我不仅想要关闭键盘,还想要删除焦点并清除查询。
val focusManager = LocalFocusManager.current
val keyboardController = LocalSoftwareKeyboardController.current
val dispatcher: OnBackPressedDispatcher =
LocalOnBackPressedDispatcherOwner.current!!.onBackPressedDispatcher
val backCallback = remember {
object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (!state.focused) {
isEnabled = false
Toast.makeText(context, "Back", Toast.LENGTH_SHORT).show()
dispatcher.onBackPressed()
} else {
println("HomeScreen() Search Back ")
state.query = TextFieldValue("")
state.focused = false
focusManager.clearFocus()
keyboardController?.hide()
}
}
}
}
DisposableEffect(dispatcher) { // dispose/relaunch if dispatcher changes
dispatcher.addCallback(backCallback)
onDispose {
backCallback.remove() // avoid leaks! …Run Code Online (Sandbox Code Playgroud) 我正在State学习jetpack compose。我发现国家持有者是真相的来源。所以创建了我的一些数据,如果我在这里做错了,你们可以指导我吗?
PairViewModel.kt
class PairViewModel : ViewModel() {
var isBluetoothEnabled = mutableStateOf(false)
private set
fun onBluetoothEnable(value: Boolean) {
isBluetoothEnabled.value = value
}
}
Run Code Online (Sandbox Code Playgroud)
配对屏幕.kt
class PairScreenState(context: Context, viewModel: PairViewModel) {
private val bluetoothManager: BluetoothManager = context.getSystemService(BluetoothManager::class.java)
private val bluetoothAdapter: BluetoothAdapter by lazy {
bluetoothManager.adapter
}
init {
viewModel.onBluetoothEnable(bluetoothAdapter.isEnabled)
}
fun checkBluetoothStatus(bluetoothStatus: MutableState<Boolean>): BroadcastReceiver {
return object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (intent?.action == BluetoothAdapter.ACTION_STATE_CHANGED) {
when (intent.getIntExtra(
BluetoothAdapter.EXTRA_STATE,
BluetoothAdapter.ERROR
)) …Run Code Online (Sandbox Code Playgroud) android kotlin android-architecture-components android-jetpack android-jetpack-compose