【问题标题】:TabLayout - How to load a fragment on tab press onlyTabLayout - 如何仅在选项卡上加载片段
【发布时间】:2020-12-24 07:52:03
【问题描述】:

我正在使用带有 TabLayout 的 ViewPager。其中一个选项卡是 ArFragment。 当 Activity 启动时,TabLayout 会遍历每个选项卡并对其进行初始化,从而导致 ArFragment 请求摄像头权限,即使没有按下相应的选项卡。

经过大量搜索,我得出结论,Sceneform 不允许控制相机权限请求时间,因此唯一的其他选择是控制选项卡加载时间。

如何让 TabLayout 在初始化时不加载特定选项卡(但之后更改选项卡时仍记得它是实例)?

关于手头的事情: 我尝试使用 addOnTabSelectedListener,但不确定如何继续使用它:

tabs.addOnTabSelectedListener(object :
        TabLayout.ViewPagerOnTabSelectedListener(viewPager) {
        override fun onTabReselected(tab: TabLayout.Tab) {
            when(tab.position) {
                // First Tab
                0 -> return

                // AR
                1 -> // I want to create a new ARFragment() and inflate it to this tab's fragment container. But how?
            }
        }
    })

有什么建议吗?

【问题讨论】:

  • 也许你只是在片段变得可见时初始化这个特性?看到这个答案stackoverflow.com/questions/35436045/…
  • 我已经考虑过了,但问题是我必须将片段的布局膨胀到 ViewGroup,我只能在 OnCreateView 函数中这样做(如果我错了,请纠正我)。我最初的问题是 OnCreateView 只在整个 TabLayout 初始化时被调用一次,我希望它在标签按下时被调用。
  • 那么如果你使用这个标签片段作为另一个在你点击标签时启动的片段的容器呢?
  • 嗯,情况正是如此。每个选项卡都是一个片段。我的 ViewPager 继承自 FragmentPagerAdapter,并通过使用 tabLayout.setupWithViewPager(viewPager) 调用返回片段的寻呼机的“getItem(position)”函数。最初,我将此函数设置为在请求适当位置时返回我的片段,但显然此函数只调用一次 - 在 TabLayout init 上。
  • 我不确定您是否正确理解了我。我说的是从你的标签片段开始一个片段。您的标签片段可能已经由您的浏览器创建。但只有当它变得可见时,您才能导航到该选项卡片段中的另一个片段,该片段最终显示您的 AR 片段(并请求所需的权限)

标签: android android-studio android-fragments android-tablayout sceneform


【解决方案1】:
class ArFragment : ... {

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_ar, container, false)
    }
    
    ovveride fun onResume() {
      // init variables
      // init views
    }
}

class MyViewPagerAdapter(private val context: Context, fm: FragmentManager,private val noOfTabs: Int) : FragmentPagerAdapter(fm,BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
   .......
   .......
}

在片段的onResume() 中执行所有与片段相关的工作,并确保在 ViewPager 适配器类中使用behavior=BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT 扩展FragmetnPagerAdapter。可以查看上面的代码sn-p。

如果您遇到任何问题,请告诉我。

【讨论】:

    猜你喜欢
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多