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

Posted

技术标签:

【中文标题】Kotlin:片段内的按钮需要在开始活动之前单击两次。如何一键启动活动?【英文标题】:Kotlin: Buttons inside a fragment needed to be clicked twice before starting the activity. How can I start the activity with only one click? 【发布时间】:2022-01-11 07:36:17 【问题描述】:

这里是新手!我很难学习片段的生命周期,我陷入了这个问题。如果我在 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)
                
            
        
    

【问题讨论】:

【参考方案1】:

创建视图时,您将 Fragment 类本身设置为两个按钮的侦听器。那将是一个可以接受的地方。

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

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

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)
        
    

【讨论】:

它对我有用!非常感谢先生,现在真的很有意义。【参考方案2】:

如果您实现 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) 开始活动(意图)

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

btn_logout.setOnClickListener Toast.makeText(getContext(), "退出。", Toast.LENGTH_SHORT).show() FirebaseAuth.getInstance().signOut() val 意图 = 意图(活动,SignInActivity::class.java) 开始活动(意图)

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

【讨论】:

以上是关于Kotlin:片段内的按钮需要在开始活动之前单击两次。如何一键启动活动?的主要内容,如果未能解决你的问题,请参考以下文章

从片段中的按钮单击打开导航抽屉(Kotlin)

如何通过单击片段内的线性布局从片段类开始新活动?下面是我的代码,但这不起作用

按钮需要单击两次才能工作 - 为啥?

如何在 Kotlin 片段内的按钮之间切换片段?

在 Activity 内部,如何暂停 for 循环以调用片段,然后在按钮单击片段后恢复循环以重新开始

片段内的按钮