Kotlin 从Activity/RecyclerView.ViewHolder返回片段并传递数据
我有一个应用程序,我从一个片段中打开一个活动,从RecyclerView中选择一个项目,然后用他们选择的项目中的数据填充原始片段。它第一次起作用,但数据似乎没有被带回到片段中,如果我第二次尝试它,它会说“没有为片段AddCardFragment{dc1763f}的id 0x7f0a001a(com.tipsy.cardgenie:id/ScrollView01)找到视图”。我想我要么没有正确地返回到创建活动的片段,要么以错误的方式使用supportfragmentmanagerKotlin 从Activity/RecyclerView.ViewHolder返回片段并传递数据,kotlin,supportfragmentmanager,Kotlin,Supportfragmentmanager,我有一个应用程序,我从一个片段中打开一个活动,从RecyclerView中选择一个项目,然后用他们选择的项目中的数据填充原始片段。它第一次起作用,但数据似乎没有被带回到片段中,如果我第二次尝试它,它会说“没有为片段AddCardFragment{dc1763f}的id 0x7f0a001a(com.tipsy.cardgenie:id/ScrollView01)找到视图”。我想我要么没有正确地返回到创建活动的片段,要么以错误的方式使用supportfragmentmanager class QA
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()
}
非常感谢你!!!就是这样——我已经为此奋斗太久了!