如何从片段获取数据到活动? [复制]

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中的另一个活动片段? [复制]

从片段中获取输入数据

无法从片段中的 SQLite 获取数据

如何从 Support V4 Fragment 获取父活动?

将活动回调发送到片段