问题描述
我有一个应用程序,我从一个片段中打开一个活动,从RecyclerView中选择一个项目,然后用他们选择的项目中的数据填充该原始片段。它第一次工作,但是数据似乎并没有被带回到片段,然后,如果我第二次尝试,它说“找不到ID为0x7f0a001a的视图(com.tipsy.cardgenie:id / ScrollView01)对于片段AddCardFragment {dc1763f}”。我想我要么没有正确返回创建活动的片段,要么以错误的方式使用了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)
这种方法从片段中打开该活动,然后使用recyclerview
从interface
中选择一项,然后可以取回数据导入活动并使用此代码片段发送回去
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函数
Adapter.kt
Class Adapter(cards: List<Card>,val clickListener: (Card) -> Unit): RecyclerView.Adapter<MyAdapter.Holder>() {
}
在onBindViewHolder方法中,设置clickListener
override fun onBindViewHolder(holder: Holder?,position: Int) {
var card : Card = cards[position]
// Calling the clickListener sent by the constructor
holder?.itemView?.setOnClickListener { clickListener(card) }
}
然后在您的活动中,在初始化适配器时进行此调用
Activity.kt
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()
}