【问题标题】:Access parent activity views from fragment in tablayout?从标签布局中的片段访问父活动视图?
【发布时间】:2021-01-05 10:09:16
【问题描述】:

我正在使用TabLayoutViewPager。我有 3 个片段和 3 个标签。我想访问activitymain.xml文件中的FloatingActionButton

在每个片段中我都写了这样的代码:

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val fab :View= (requireActivity() as MainActivity).findViewById(R.id.fab_main)

            fab.setOnClickListener {
                Toast.makeText(context,"Fragment1",Toast.LENGTH_SHORT).show()  
            }
        }

但是当我单击每个片段中的FloatingActionButton 时,它会给出与最后一个片段相关的相同 Toast 消息。当我点击按钮时,我想在每个片段中执行不同的操作。

【问题讨论】:

  • 您应该在活动中调用浮动操作按钮。您可以通过 viewpager 或片段管理器访问当前片段。
  • 你试过在onResume()中设置点击监听吗?
  • 但是我需要在片段中调用浮动操作按钮,因为我需要在片段中处理它。
  • @MohamedHamdy 现在我尝试了您的解决方案并且它有效。太感谢了!但我不明白是什么造成了将监听器放在 onResume() 中的差异。你能解释一下吗?
  • @AbdulsametKılınçarslan 要了解这部分,请在 onCreateViewonResume 中添加日志记录,这将更容易理解差异,然后去阅读 @Daniel.Wang 的 cmets

标签: android android-layout kotlin android-fragments android-activity


【解决方案1】:

您可以将 FragmentStatePagerAdapter 用于选项卡功能

class TabAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
..........
}

当片段处于​​活动状态时,它将使片段调用 onResume。 所以你可以在 Fragment 中喜欢这个

override fun onResume() {
    super.onResume()

    val fab :View= (requireActivity() as MainActivity).findViewById(R.id.fab_main)

    fab.setOnClickListener {
        Toast.makeText(context,"Fragment1",Toast.LENGTH_SHORT).show()  
    }
}

【讨论】:

  • 谢谢丹尼尔!现在,当我将代码放入 onResume() 方法时,它就可以工作了。谢谢!但是为什么我们需要将代码放在 onResume() 方法中呢?
  • FragmentStatePagerAdapter 将在片段处于活动状态时调用 onResume。所以如果你把 setOnClickListener 放在 onResume 方法中,这个监听器就会发生 fab 按钮事件。
  • 如果将事件监听代码放在onCreate中,点击事件监听会被其他fragment覆盖。你现在有三个片段。所以第一个事件监听器将被其他片段中的第二个事件监听器丢弃。但是如果你把代码放在 onResume 中,当 Fragment 处于活动状态时会设置事件监听器。它将正常工作。
  • 我目前正在使用 ViewPager2。我的 ViewpagerAdapter 类扩展了 FragmentStateAdapter 因为 FragmentStatePagerAdapter 已被弃用。有时,当我单击 3 个片段之一中的浮动操作按钮时,它打开的内容与我预期的不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
相关资源
最近更新 更多