gpt4 book ai didi

android - 用户交互能否在 OnResume 完成之前触发事件?

转载 作者:行者123 更新时间:2023-12-03 16:21:53 28 4
gpt4 key购买 nike

在我的一个 Fragment s,我正在注册 OnFocusChangeListener对于 EditTextonResume() :

override fun onResume() {
super.onResume()
editText.setOnFocusChangeListener {
// do something here
}
}

我在 onResume() 中注册监听器因为如果我在更早的生命周期方法中设置它,它将在每次配置更改时触发。将其设置为 onResume()确保在注册监听器之前已经恢复配置更改之前存在的焦点,因此监听器不会在配置更改/焦点恢复后自动触发。

现在我担心我注册这个监听器可能为时已晚。所以我的问题是:用户交互是否已经在 onResume() 之前或期间引起了对元素的关注?被执行? (这意味着我会放弃这个焦点事件,因为我在 onResume() 期间设置了监听器)。或更笼统地说:当 onResume() 时,用户交互是否已经成为可能?正在执行? fragment documentationonResume() :

Called when the fragment is visible to the user and actively running.



“对用户可见”是什么意思很清楚,但“积极运行”到底是什么意思?这是否已经意味着接受用户输入?或者是在 onResume() 之后首先接受用户输入吗?已完成?

最佳答案

焦点恢复在 Activity 的 onRestoreInstanceState() 中完成,这与 Fragment 恢复自己的 View 状态时分开完成(即在 Fragment 的 onViewStateRestored() 中)。

根据 onRestoreInstanceState()文档,它在 Activity 的 onStart() 之间调用和 onPostCreate() (在 onResume()onPostResume() 之前运行 - onPostResume() 是 Fragment 获得 onResume() 回调的时间)。

这意味着您是正确的,在 onResume() 之前的 fragment 级别没有可用的回调。在调用该方法之前正确设置焦点的位置。

话虽如此,是的,用户可以在 Fragment 达到恢复状态之前与它进行交互。例如, ViewPager2 (以及使用 BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT 时的 ViewPager 1)将未选择的 fragment (即不在屏幕中间的 fragment )保留在 STARTED 中状态。通过多点触控的力量,用户可以将页面轻轻拖过,然后用另一根手指点击部分可见的 View 。如果您使用 setMaxLifecycle() ,您会看到相同的行为。与 Lifecycle.State.STARTED你自己(这就是那些在幕后所做的) - fragment 是可交互的,但不能恢复。

然而,在大多数一般情况下,如果您不使用上述任何 API,Fragment 生命周期通常会与 Activity 生命周期相匹配。还有一个 Activity ,根据 ActivityThread source code , 确实在同一个 handleStartActivity() 中运行它的更新方法。

需要注意的是,每次销毁 Activity 时,您都会收到一个回调到您的OnFocusChangeListener。与 hasFocusfalse因为 View 从 Activity 中删除(它总是失去 View 的焦点)。这发生在保存状态之后, View 的焦点状态实际上并没有丢失,它只是您已经需要在回调中处理的事情,通常通过检查 isStateSaved() 并在保存状态并检查 isRemoving() 后忽略焦点丢失如果您手动删除/替换 fragment (即,通过执行 replace() 操作)。

鉴于您已经必须在监听器中包含逻辑以避免处理 hasFocus对于销毁后的错误事件,处理获得焦点的 100% 正确案例将涉及在您保存的实例状态中保存您自己的焦点状态(即特定 View 的真或假),并且仅在 hasFocus 时运行您的逻辑正在改变您已经保存的内容。这意味着您将在 Fragment 生命周期的早期恢复已保存的实例状态(例如,在 Fragment 提供的 onViewStateRestored() 方法中)并在那里添加您的监听器。然后,您的逻辑可以安全地忽略具有相同焦点的回调:

override fun onViewStateRestored(savedInstanceState: Bundle?) {
super.onViewStateRestored(savedInstanceState)
// Restore your member variable of focus
focused = savedInstanceState?.getBoolean("HAS_FOCUS", false) ?: false
editText.setOnFocusChangeListener { _, hasFocus ->
if (focused == hasFocus) {
// ignore
return
}
focused = hasFocus
if (hasFocus) {
// We gained focus
} else if (!isStateSaved() && !isRemoving()) {
// We lost focus
}
}
}

关于android - 用户交互能否在 OnResume 完成之前触发事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60806116/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com