片段替换后按钮失去监听器

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