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:片段内的按钮需要在开始活动之前单击两次。如何一键启动活动?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过单击片段内的线性布局从片段类开始新活动?下面是我的代码,但这不起作用