如何使用 Kotlin 从 Android 中的片段访问另一个片段?
Posted
技术标签:
【中文标题】如何使用 Kotlin 从 Android 中的片段访问另一个片段?【英文标题】:How access another fragment from a fragment in Android using Kotlin? 【发布时间】:2020-10-30 23:06:48 【问题描述】: val dialog = AlertDialog.Builder(activity as Context)
dialog.setTitle("Confirmation")
dialog.setMessage("Are you sure you want to log out?")
dialog.setPositiveButton("YES") text, listener ->
sharedPreferences.edit().clear().apply()
println("Shared preferences cleared")
println("Logged out")
val intent = Intent(activity as Context, LoginActivity::class.java)
startActivity(intent)
dialog.setNegativeButton("NO")text,listener ->
val homeFragment = HomeFragment()
val beginTransaction = activity!!.supportFragmentManager.beginTransaction()
beginTransaction.replace(R.id.frameLayout, homeFragment)
beginTransaction.commit()
activity!!.navigationView.setCheckedItem(R.id.home_screen)
println("Home title set")
activity!!.actionBar!!.title = "Home"
dialog.create()
dialog.show()
当用户单击“否”按钮时,我想转到主页片段。我被定向到 Home Fragment,但对话框并没有消失,当我再次单击“否”时,应用程序崩溃,并在行上出现空指针异常:
val beginTransaction = activity!!.supportFragmentManager.beginTransaction()
当我到达主页片段时如何删除对话框? 请帮忙。
【问题讨论】:
首先要告诉大家的是,activity!!.supportFragmentManager
Activity 的强制解包是非常危险的。小心这些力展开。
是的,但是如果我不使用编译器会报错!!运算符
那是因为你应该这样使用它,可能; val beginTransaction = activity?.supportFragmentManager?.beginTransaction() beginTransaction?.let it.replace(R.id.frameLayout, homeFragment) it.commit()
【参考方案1】:
在提交事务之前调用dialog.dismiss();
并且在转移到另一个活动之前
val builder = AlertDialog.Builder(activity as Context)
.setTitle("Confirmation")
.setMessage("Are you sure you want to log out?")
.setPositiveButton("YES") dialog, _ ->
sharedPreferences.edit().clear().apply()
println("Shared preferences cleared")
println("Logged out")
dialog.dismiss()
val intent = Intent(activity as Context, LoginActivity::class.java)
startActivity(intent)
.setNegativeButton("NO")dialog,_ ->
val homeFragment = HomeFragment()
val beginTransaction = activity!!.supportFragmentManager.beginTransaction()
beginTransaction.replace(R.id.frameLayout, homeFragment)
dialog.dismiss()
beginTransaction.commit()
activity!!.navigationView.setCheckedItem(R.id.home_screen)
println("Home title set")
activity!!.actionBar!!.title = "Home"
.show()
【讨论】:
显然没有这种方法【参考方案2】:问题是,作为 clicklisteners 的参数,您会得到一个 DialogInterface
对象。该对象有一个dismiss()
方法。你需要调用那个来关闭对话框。
val dialog = AlertDialog.Builder(activity as Context)
dialog.setTitle("Confirmation")
dialog.setMessage("Are you sure you want to log out?")
dialog.setPositiveButton("YES") text, listener ->
sharedPreferences.edit().clear().apply()
println("Shared preferences cleared")
println("Logged out")
val intent = Intent(activity as Context, LoginActivity::class.java)
startActivity(intent)
dialog.setNegativeButton("NO")dlgInterface: DialogInterface,listener ->
val homeFragment = HomeFragment()
val beginTransaction = activity?.supportFragmentManager.beginTransaction()
beginTransaction.replace(R.id.frameLayout, homeFragment)
beginTransaction.commit()
activity?.navigationView.setCheckedItem(R.id.home_screen)
println("Home title set")
activity?.actionBar?.title = "Home"
dlgInterface.dismiss()
dialog.create()
dialog.show()
另外请停止使用强制解包!!
。 Kotlin 具有安全展开 ?
的魔力,它可以挽救生命。使用它;)
【讨论】:
以上是关于如何使用 Kotlin 从 Android 中的片段访问另一个片段?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Kotlin 在 android 中的 BottomNavigationView 上设置 OnNavigationItemListener?
如何在 Android Studio 中使用 Kotlin 从 Firebase 中的数据库中获取特定值?
如何将偏移量应用于 android (Kotlin) 中的 Contacts Provider 查询?
如何从 Kotlin Android 中的 LinkedHashMap 手动获取第一和第二位置的对象?
如何从 Firebase android kotlin 获取所有具有特定价值的孩子?
使用 Kotlin 从 Android 上 ViewModel 中的 LiveData 更新 ListView 中的元素