【问题标题】:How access another fragment from a fragment in Android using Kotlin?如何使用 Kotlin 从 Android 中的片段访问另一个片段?
【发布时间】: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() }

标签: android kotlin android-fragments nullpointerexception


【解决方案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 具有安全展开 ? 的魔力,它可以挽救生命。使用它;)

【讨论】:

    猜你喜欢
    • 2020-01-04
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多