【发布时间】:2020-11-30 10:47:11
【问题描述】:
我在 Kotlin 上遇到了最奇怪的错误,经过两天的尝试,我终于寻求帮助。 问题很简单:我有两个片段和一个活动,第一个片段A是一个表单,带有一个验证按钮,当我点击验证时,片段B替换片段A,如果我按下回,片段A显示再次填写表格。
我的问题是片段再次显示后,我可以点击按钮但监听器没有被调用,所以我不能再次进入片段B。奇怪的是另一个监听器工作正常,所以我认为这是因为前一个片段正在捕获 onClick,但不知道该怎么做。这是一些代码:
ViewUtils:
fun addFragment(activity: Activity, fragment: androidx.fragment.app.Fragment, container: Int) {
val fragmentManager = (activity as AppCompatActivity).supportFragmentManager
val pendingTransaction = fragmentManager.beginTransaction().add(container, fragment, fragment.javaClass.name)
pendingTransaction.commitAllowingStateLoss()
}
fun replaceFragment(manager: FragmentManager, fragment: androidx.fragment.app.Fragment, container: Int) {
if (fragment.isAdded) return
val pendingTransaction = mangaer.beginTransaction()
pendingTransaction.replace(container, fragment, fragment.javaClass.name)
pendingTransaction.commitAllowingStateLoss()
}
fun removeFragment(activity: Activity, fragment: Fragment) {
val manager = (activity as AppCompatActivity).supportFragmentManager
val trans = manager.beginTransaction()
trans.remove(fragment)
trans.commit()
manager.popBackStack()
}
活动:
fun displayFragmentA() {
ViewUtils.replaceFragment(supportFragmentManager, FragmentA,
R.id.fragmentLayout)
}
fun FragmentB() {
ViewUtils.replaceFragment(supportFragmentManager, FragmentB,
R.id.fragmentLayout)
}
片段 A
class AFragment : BaseFragment(), AContract.View {
companion object {
@JvmStatic
fun newInstance(): AFragment {
val fragment = AFragment()
return fragment
}
}
@Inject
lateinit var APresenter: AContract.Presenter<AContract.View>
//end region
//region lifecycle
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_A_layout, container, false)
}
override fun onResume() {
super.onResume()
button_validate.setOnClickListener {
presenter.goToNextStep()
}
}
override fun onAttach(context: Context) {
AndroidSupportInjection.inject(this)
super.onAttach(context)
}
监听器是在 onViewCreated 中设置的,但我尝试将它移到 onResume(没有改变任何东西)
我认为片段 B 代码并不重要,但如果有帮助,我可以添加它。
欢迎任何帮助,我真的不知道发生了什么,替换/添加方法在我来项目之前就已经存在,它们并不完美,但它们正在项目的其他地方工作。
我尝试使用断点,按钮不为空但我们从未进入监听器。
编辑:我在 3 种不同的设备上进行了尝试,我没有使用 Sony Android 9 的错误,但使用华为等一加 6 Android 10,问题仍然存在..
【问题讨论】:
-
那么你是说当你从片段 B 回到 grahemA 时你的 onResume 断点被命中?但是监听器中的实际代码永远不会执行?
-
除此之外,我强烈建议您查看 Jetpack Navigation developer.android.com/guide/navigation,它是一种较新的导航方式,可以解决您在自己导航过程中遇到的许多其他问题
-
你能告诉我们片段A代码吗
-
你确定
onClickListener根本没有触发,或者只是goToNextStep()在再次使用/按下时不起作用? -
@DavidKroukamp 确实,onResume 中的断点命中但侦听器中的实际代码从未执行,我知道为什么。我知道 Jetpack 导航听起来很棒,但我正在做一个巨大的项目,不幸的是我现在无法改变
标签: android kotlin android-fragments fragment