Kotlin:片段内的按钮需要在启动 activity 之前单击两次。如何一键启动activity?

Kotlin: Buttons inside a fragment needed to be clicked twice before starting the activity. How can I start the activity with only one click?

这里是新手!我很难学习片段的生命周期,我陷入了这个问题。如果我在 emu 上 运行 这个,片段显示在 activity 但片段内的按钮需要点击两次才能 运行 目的地 activity.

FragmentSetting.kt:

    class FragmentSetting : Fragment(), View.OnClickListener {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view: View = inflater!!.inflate(R.layout.fragment_main_setting, container, false)
        val btnLogout: Button = view.findViewById(R.id.btn_logout)
        val btnArticle: Button = view.findViewById(R.id.btn_art)
        btnLogout.setOnClickListener(this)
        btnArticle.setOnClickListener(this)
        return view
    }

    companion object {
        fun newInstance(): FragmentSetting {
            return FragmentSetting()
        }
    }

    override fun onClick(v: View?) {
        when (v?.id) {
            R.id.btn_logout -> {
                btn_logout.setOnClickListener {
                    Toast.makeText(getContext(), "Signed Out.", Toast.LENGTH_SHORT).show()
                    FirebaseAuth.getInstance().signOut()
                    val intent = Intent(activity, SignInActivity::class.java)
                    startActivity(intent)
                }
            }

            R.id.btn_art -> {
                btn_art.setOnClickListener {
                    Toast.makeText(getContext(), "Hello World", Toast.LENGTH_SHORT).show()
                    val intent = Intent(activity, ArticleActivity::class.java)
                    startActivity(intent)
                }
            }
        }
    }
}

您正在将片段 class 本身设置为创建视图时两个按钮的侦听器。那将是一个可以接受的地方。

但是,您的侦听器函数不会执行您想要的按钮操作。相反,它为每个按钮设置一个新的侦听器。所以他们第一次被点击时,他们得到了他们的新听众。只有在那个内部辅助侦听器中,您才会转到另一个 activity,所以这就是为什么需要点击两次。

您需要直接执行操作,而不是将操作包装在设置另一个侦听器中。顺便说一句,传递给点击侦听器的视图永远不会为空,因此您可以删除 ?

override fun onClick(v: View) {
    when (v.id) {
        R.id.btn_logout -> {
            Toast.makeText(getContext(), "Signed Out.", Toast.LENGTH_SHORT).show()
            FirebaseAuth.getInstance().signOut()
            val intent = Intent(activity, SignInActivity::class.java)
            startActivity(intent)
        }
        R.id.btn_art -> {
            Toast.makeText(getContext(), "Hello World", Toast.LENGTH_SHORT).show()
            val intent = Intent(activity, ArticleActivity::class.java)
            startActivity(intent)
        }
    }
}

有两个不同的事情,第一,如果你实现了 View.OnClickListener 接口,那么你顽固地使用 onclick 回调方法,每次你点击它们都会触发,这意味着在 onclick 方法中执行一段代码,在 onclick 中写入方法,因此在您当前的代码中,首先单击它们将设置 setOnclicklistener,然后在您下次单击时它将按预期工作。
如此简单就是您直接执行带花括号的代码,无需设置 setOnClickListener。 例如:

R.id.btn_art -> { Toast.makeText(getContext(), "Hello World", Toast.LENGTH_SHORT).show() val intent = Intent(activity, ArticleActivity::class.java) startActivity(intent) }

第二件事是您在 onCreateView 中设置了 setOnClickOnClickListenre 并且没有实现 clicklistenere。 例如:

btn_logout.setOnClickListener { Toast.makeText(getContext(), "Signed Out.", Toast.LENGTH_SHORT).show() FirebaseAuth.getInstance().signOut() val intent = Intent(activity, SignInActivity::class.java) startActivity(intent) }

但他们的最佳实践是您可以根据视图架构在 onclick 方法中处理点击侦听器。