从 Activity / RecyclerView.ViewHolder 返回片段并传递数据
Going back to a Fragment from an Activity / RecyclerView.ViewHolder and Passing data
我有一个应用程序,我从一个片段中打开一个 activity,从 RecyclerView 中打开一个项目 select,然后用他们 select 项目中的数据填充原始片段.它第一次工作,但数据似乎没有传回片段,然后如果我第二次尝试它,它会说“没有找到 id 0x7f0a001a (com.tipsy.cardgenie:id/ScrollView01) 片段 AddCardFragment{dc1763f}”。我想我要么没有正确返回到创建 activity 的片段,要么以错误的方式使用了 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 片段中,没有看到我在 activity 中设置的数据:
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>
提前感谢您的任何帮助或建议!!
我可以建议,如果没有必要打开新的 activity 那么你可以在片段中有一个列表或 recyclerview
这样你就可以在片段中获取更新的数据并执行任何你想做的事情.
但是如果你想从特定的 activity 中获取数据到片段,你可以使用 startActivityForResult(yourIntent,requestCode)
这种方法从片段中打开那个 activity ,并在从 recyclerview
中选择一个项目后使用 interface
您可以将数据取回 activity 并使用此代码片段发送回片段
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
}
然后根据需要更新您的代码...无需替换另一个 activity 的片段。
建议在fragments中处理点击事件,使用回调方法。您可以像这样在适配器的构造函数中添加一个 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 中,您在初始化适配器时进行此调用
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()
}
我有一个应用程序,我从一个片段中打开一个 activity,从 RecyclerView 中打开一个项目 select,然后用他们 select 项目中的数据填充原始片段.它第一次工作,但数据似乎没有传回片段,然后如果我第二次尝试它,它会说“没有找到 id 0x7f0a001a (com.tipsy.cardgenie:id/ScrollView01) 片段 AddCardFragment{dc1763f}”。我想我要么没有正确返回到创建 activity 的片段,要么以错误的方式使用了 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 片段中,没有看到我在 activity 中设置的数据:
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>
提前感谢您的任何帮助或建议!!
我可以建议,如果没有必要打开新的 activity 那么你可以在片段中有一个列表或 recyclerview
这样你就可以在片段中获取更新的数据并执行任何你想做的事情.
但是如果你想从特定的 activity 中获取数据到片段,你可以使用 startActivityForResult(yourIntent,requestCode)
这种方法从片段中打开那个 activity ,并在从 recyclerview
中选择一个项目后使用 interface
您可以将数据取回 activity 并使用此代码片段发送回片段
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
}
然后根据需要更新您的代码...无需替换另一个 activity 的片段。
建议在fragments中处理点击事件,使用回调方法。您可以像这样在适配器的构造函数中添加一个 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 中,您在初始化适配器时进行此调用
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()
}