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 方法中处理点击侦听器。
这里是新手!我很难学习片段的生命周期,我陷入了这个问题。如果我在 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 方法中处理点击侦听器。