片段替换后按钮失去监听器
Button lose listener after fragment replace
我在 Kotlin 上遇到了最奇怪的错误,经过两天的尝试,我终于寻求帮助。
问题很简单:我有两个片段和一个 activity,第一个片段 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()
}
Activity :
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代码我觉得不重要,但如果有帮助我可以添加。
欢迎任何帮助,我真的不知道发生了什么,replace/add 方法在我进入项目之前就已经存在,它们并不完美,但它们正在项目的其他地方工作。
我尝试使用断点,按钮不为空但我们从未进入侦听器。
编辑:我试过 3 种不同的设备,索尼 Android 9 没有这个错误,但是华为等一加 6 Android 10,问题仍然存在..
好的,在问了很多人之后,我找到的唯一解决方案是不使用 kotlin.synthetic,而是使用 findById :
view.findViewById<Button>(R.id.button_validate.setOnClickListener
我在 Kotlin 上遇到了最奇怪的错误,经过两天的尝试,我终于寻求帮助。 问题很简单:我有两个片段和一个 activity,第一个片段 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()
}
Activity :
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代码我觉得不重要,但如果有帮助我可以添加。
欢迎任何帮助,我真的不知道发生了什么,replace/add 方法在我进入项目之前就已经存在,它们并不完美,但它们正在项目的其他地方工作。
我尝试使用断点,按钮不为空但我们从未进入侦听器。
编辑:我试过 3 种不同的设备,索尼 Android 9 没有这个错误,但是华为等一加 6 Android 10,问题仍然存在..
好的,在问了很多人之后,我找到的唯一解决方案是不使用 kotlin.synthetic,而是使用 findById :
view.findViewById<Button>(R.id.button_validate.setOnClickListener