【问题标题】:Button lose listener after fragment replace片段替换后按钮丢失侦听器
【发布时间】: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


【解决方案1】:

好吧,在问了很多人之后,我找到的唯一解决方案是不使用 kotlin.synthetic,而是使用 findById :

view.findViewById<Button>(R.id.button_validate.setOnClickListener

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多