如何从片段获取数据到活动? [复制]
Posted
技术标签:
【中文标题】如何从片段获取数据到活动? [复制]【英文标题】:How to get data from fragment to activity? [duplicate] 【发布时间】:2021-12-18 12:07:37 【问题描述】:如何正确地将数据从片段传输到活动?我这样做: 1- 创建界面
interface IProfileToActivity
fun profileInfo(data: AllHeroes.Global)
2- 然后我在activity中继承
class ProfileActivity : AppCompatActivity(), IProfileToActivity
private lateinit var myBinding: ActivityProfileBinding
override fun profileInfo(data: AllHeroes.Global)
myBinding.tvUsername.text = data.name
myBinding.tvDivision.text = data.rank.rankName
Log.i("Apex Info 3", data.toString())
3- 从片段发送
override fun onViewCreated(view: View, savedInstanceState: Bundle?)
super.onViewCreated(view, savedInstanceState)
(activity as? IProfileToActivity)?.profileInfo(allInfoApexResponse.global)
mHeroesAdapter.heroesList(allAdapterListHero)
但是什么也没发生,为什么?我做错了什么?
【问题讨论】:
您可以使用共享ViewModel
。在其中存储和更新可变的实时数据,并将其范围限定为 MainAcitivity。您也可以使用Communicator
@AbhishekDutt 你能举个例子吗?请
为什么这个问题被关闭了?这与将数据传递给容器活动无关。
@ArpitShukla 我不知道为什么((事实上,我和那个例子一样
@Ethernets 我建议您发布另一个问题,其中包含更多详细信息,说明您要将数据发送到哪里。
【参考方案1】:
您无需在此处创建接口。您可以使用requireActivity()
获取对父活动的引用。使用它,您可以访问活动的公共字段和功能。
class ProfileActivity : AppCompatActivity()
private lateinit var myBinding: ActivityProfileBinding
fun profileInfo(data: AllHeroes.Global)
myBinding.tvUsername.text = data.name
myBinding.tvDivision.text = data.rank.rankName
Log.i("Apex Info 3", data.toString())
在你的片段中:
override fun onViewCreated(view: View, savedInstanceState: Bundle?)
super.onViewCreated(view, savedInstanceState)
(requireActivity as ProfileToActivity).profileInfo(allInfoApexResponse.global)
mHeroesAdapter.heroesList(allAdapterListHero)
【讨论】:
我收到错误java.lang.ClassCastException: com.example.apextracker.view.activities.MainActivity cannot be cast to com.example.apextracker.view.activities.ProfileActivity
我认为这是因为 ProfileActivity 不是片段的父级
因此,片段的父级是 MainActivity,但您想将数据发送到 ProfileActivity。是这样吗?
是的,没错
个人资料活动在哪里?是在后台吗?
ProfileActivity 是一个独立于fragment的activity,在菜单调用override fun onOptionsItemSelected (item: MenuItem): Boolean when (item.itemId) R.id.action_profile -> (requireActivity () as ProfileActivity) .profileInfo (testApex) startActivity (Intent (requireActivity (), ProfileActivity :: class.java)) return true return super.onOptionsItemSelected (item)
时启动【参考方案2】:
有很多方法可以将数据从片段传递到活动:
使用共享ViewModel
。
ViewModel
用于管理和存储 UI 相关数据 生命周期意识的方式。 ~阅读更多
class SharedViewModel: ViewModel()
private val currItems: MutableLiveData<List<Item>> =
MutableLiveData<List<Item>>(listOf())
fun getCurrItem(): LiveData<List<Item>>
return currItems
fun sendCurrItems(items: MutableList<Item>)
currItems.postValue(items)
class ItemFragment: Fragment()
private val sharedModel: SharedViewModel by activityViewModels()
MainActivity: AppCompactActivity()
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
val model = ViewModelProvider(this).get(SharedViewModel::class.java)
在上述类中,使用MutableList
存储和更新数据。这里需要注意的是,上面的类是singleton
类,即一旦创建,只有在activity结束时才会销毁。
假设item
必须从ItemFragment
共享到MainActivity
必须实现一个回调MainActivity
。为此,可以使用Interface
interface ItemListener
fun sendItem(item : MutableList<Item>)
ItemFragment
:
class ItemFragment: Fragment()
override fun sendItems(items: MutableList<Item>?)
// Send an Item from here as well as update it
// Or just simply call sendItem method.
MainActivity
:
class MainActivity: AppCompactActivity()
fun receiveItem(context : Context)
private var mCallback: ItemListener? = null
mCallback = context
【讨论】:
以上是关于如何从片段获取数据到活动? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
如何将数据从一个活动传递到android中的另一个活动片段? [复制]