Kotlin 从Activity/RecyclerView.ViewHolder返回片段并传递数据

Kotlin 从Activity/RecyclerView.ViewHolder返回片段并传递数据,kotlin,supportfragmentmanager,Kotlin,Supportfragmentmanager,我有一个应用程序,我从一个片段中打开一个活动,从RecyclerView中选择一个项目,然后用他们选择的项目中的数据填充原始片段。它第一次起作用,但数据似乎没有被带回到片段中,如果我第二次尝试它,它会说“没有为片段AddCardFragment{dc1763f}的id 0x7f0a001a(com.tipsy.cardgenie:id/ScrollView01)找到视图”。我想我要么没有正确地返回到创建活动的片段,要么以错误的方式使用supportfragmentmanager class QA

我有一个应用程序,我从一个片段中打开一个活动,从RecyclerView中选择一个项目,然后用他们选择的项目中的数据填充原始片段。它第一次起作用,但数据似乎没有被带回到片段中,如果我第二次尝试它,它会说“没有为片段AddCardFragment{dc1763f}的id 0x7f0a001a(com.tipsy.cardgenie:id/ScrollView01)找到视图”。我想我要么没有正确地返回到创建活动的片段,要么以错误的方式使用supportfragmentmanager

class QAViewHolder(view: View) : RecyclerView.ViewHolder(view) {

itemView.setOnClickListener { v: View ->
 val addCard = AddCardFragment()
                    val args = Bundle()
                    val activity = v.context as AppCompatActivity
                    args.putString("sport", cards.sport).toString()

                    activity.supportFragmentManager.beginTransaction()
                        .replace(R.id.content, addCard)
                        .addToBackStack(null)
                        .commit()
}
}
在我创建的片段onCreate中,没有看到我在活动中设置的数据:

 val bundle = this.arguments
            if (bundle != null) {
                sport = bundle.getString("sport").toString()
            }
内容视图位于片段的布局中,我也将返回

<FrameLayout
        android:id="@+id/content"
        android:layout_height="match_parent"
        android:layout_width="match_parent">
</FrameLayout>


提前感谢您的帮助或建议

我可以建议,如果没有必要打开新活动,那么您可以在片段中创建一个列表或
recyclerview
,这样您就可以在片段中获得更新的数据,并执行任何您想要的操作。 但是,如果您想从特定的活动到片段中获取数据,您可以使用
startActivityForResult(yourIntent,requestCode)
此方法从片段中打开该活动,在使用
interface
recyclerview
中选择一个项目后,您可以将数据返回到“活动”中,并使用此片段发送回“片段”

val myIntent = Intent()
    myIntent.putExtra("data","your data")
    setResult(RESULT_OK,myIntent)
    finish()
现在,您可以在片段中声明下面的方法,并从中获取数据

 override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)
    // you can get your whatever data in @data object
}

然后根据需要更新代码…无需替换其他活动的片段。

建议在片段中处理单击事件并使用回调方法。您可以像这样在适配器的构造函数中添加clickListener函数

适配器.kt

Class Adapter(cards: List<Card>,val clickListener: (Card) -> Unit): RecyclerView.Adapter<MyAdapter.Holder>() {
}
val adapter = Adapter(cards) {
  val addCard = AddCardFragment()
  val args = Bundle()
  args.putString("sport", cards.sport).toString()

  supportFragmentManager.beginTransaction()
      .replace(R.id.content, addCard)
      .addToBackStack(null)
      .commit()
}
然后在活动中,在初始化适配器时进行此调用

活动.kt

Class Adapter(cards: List<Card>,val clickListener: (Card) -> Unit): RecyclerView.Adapter<MyAdapter.Holder>() {
}
val adapter = Adapter(cards) {
  val addCard = AddCardFragment()
  val args = Bundle()
  args.putString("sport", cards.sport).toString()

  supportFragmentManager.beginTransaction()
      .replace(R.id.content, addCard)
      .addToBackStack(null)
      .commit()
}

非常感谢你!!!就是这样——我已经为此奋斗太久了!