如何使用 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 中的元素