Car*_*son 5 android-jetpack-compose android-jetpack-compose-scaffold
我有一些元素集中在底部工作表中。我想在按下系统后退按钮时折叠底部工作表,这很简单:
BackHandler(enabled = bottomSheetState.isExpanded) {
scope.launch {
bottomSheetState.collapse()
}
}
Run Code Online (Sandbox Code Playgroud)
问题是,如果一个元素聚焦在底部工作表中,则只有在按两次后退按钮后才会触发后退处理程序的逻辑:一次从元素(轮廓文本字段)中删除焦点,再一次触发折叠。
我尝试使用 来LocalFocusManager.current组合按下后退时清除焦点,但直到元素已经失去焦点后才触发后退逻辑。
我可以清楚地关注折叠,所以我猜真正的问题是当工作表 1) 可见并且 2) 有一个子元素聚焦时,必须按回两次。
有没有办法阻止焦点元素取代我的后台逻辑?
您好@Carter,我在官方跟踪器上发现了该问题,请在此处找到链接。它已在compose 1.1.0-alpha03中修复,但由于该库是 alpha 候选库,我不知道它对于生产来说有多安全。这里还提到了一个解决方法
更干净的方法是:
/***
* Compose issue to be fixed in alpha 1.03
* track from here : https://issuetracker.google.com/issues/192433071?pli=1
* current work around
*/
class KeyBoardManager(context: Context) {
private val activity = context as Activity
private var keyboardDismissListener: KeyboardDismissListener? = null
private abstract class KeyboardDismissListener(
private val rootView: View,
private val onKeyboardDismiss: () -> Unit
) : ViewTreeObserver.OnGlobalLayoutListener {
private var isKeyboardClosed: Boolean = false
override fun onGlobalLayout() {
val r = Rect()
rootView.getWindowVisibleDisplayFrame(r)
val screenHeight = rootView.rootView.height
val keypadHeight = screenHeight - r.bottom
if (keypadHeight > screenHeight * 0.15) {
// 0.15 ratio is right enough to determine keypad height.
isKeyboardClosed = false
} else if (!isKeyboardClosed) {
isKeyboardClosed = true
onKeyboardDismiss.invoke()
}
}
}
fun attachKeyboardDismissListener(onKeyboardDismiss: () -> Unit) {
val rootView = activity.findViewById<View>(android.R.id.content)
keyboardDismissListener = object : KeyboardDismissListener(rootView, onKeyboardDismiss) {}
keyboardDismissListener?.let {
rootView.viewTreeObserver.addOnGlobalLayoutListener(it)
}
}
fun release() {
val rootView = activity.findViewById<View>(android.R.id.content)
keyboardDismissListener?.let {
rootView.viewTreeObserver.removeOnGlobalLayoutListener(it)
}
keyboardDismissListener = null
}
}
Run Code Online (Sandbox Code Playgroud)
@Composable
fun AppKeyboardFocusManager() {
val context = LocalContext.current
val focusManager = LocalFocusManager.current
DisposableEffect(key1 = context) {
val keyboardManager = KeyBoardManager(context)
keyboardManager.attachKeyboardDismissListener {
focusManager.clearFocus()
}
onDispose {
keyboardManager.release()
}
}
}
Run Code Online (Sandbox Code Playgroud)
setContent {
AppKeyboardFocusManager()
YourAppMaterialTheme {
...
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2032 次 |
| 最近记录: |