ViewPager 在使用前激活它的片段
ViewPager activates its fragments before usage
我正在使用 ViewPager 在作为选项卡的不同片段之间滑动。我注意到仅通过创建适配器,就会立即调用每个片段中的 onCreateView 函数,这不好,因为我想 运行 在特定给定时间这些函数中的代码。
我在 MainActivity 中的代码:
private var profileTab: TabLayout.Tab? = null
private var swipeTab: TabLayout.Tab? = null
private var matchesTab: TabLayout.Tab? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
profileTab = navigationTabs.newTab()
swipeTab = navigationTabs.newTab()
matchesTab = navigationTabs.newTab()
navigationTabs.addTab(profileTab!!)
navigationTabs.addTab(swipeTab!!)
navigationTabs.addTab(matchesTab!!)
val adapter = PagerAdapter(supportFragmentManager, navigationTabs.tabCount)
fragmentContainer.adapter = adapter
我的PagerAdapter.kt代码:
class PagerAdapter (fm: FragmentManager, private val mNoOfTabs: Int) : FragmentStatePagerAdapter(fm, mNoOfTabs) {
override fun getItem(position: Int): Fragment {
when (position) {
0 -> {
return ProfileFragment()
}
1 -> {
return SwipeFragment()
}
2 -> {
return MatchesFragment()
}
}
return null!!
}
override fun getCount() = mNoOfTabs
}
在 activity_main.xml 中(如果重要的话):
<com.google.android.material.tabs.TabLayout
android:id="@+id/navigationTabs"
android:layout_width="match_parent"
android:layout_height="@dimen/navigation_height"
android:background="@drawable/navigation_shadow"
app:layout_constraintTop_toTopOf="parent"
app:tabIndicator="@null"
app:tabMinWidth="@dimen/navigation_height"
app:tabRippleColor="@null" />
<!-- // the fragment will be displayed here:-->
<androidx.viewpager.widget.ViewPager
android:id="@+id/fragmentContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="100dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/navigationTabs"/>
这是默认行为吗?能不能阻止,让碎片不会马上启动?
ViewPager 将最少初始化两个片段。
ViewPager 允许我们设置 setOffscreenPageLimit()
,但它至少需要 1,所以它会初始化第一个和下一个片段。
在这里阅读更多 ViewPager.setOffscreenPageLimit(0) doesn't work as expected
尝试通过在MainActivity中设置onPageChangedListener()
来调用fragments中的代码,这样就可以在用户swiped/opened fragment时执行代码。
Android 中的 ViewPager 默认情况下,加载当前片段的另外 2 个片段。这是一个前一个片段和一个下一个片段以实现流畅的动画。而且您无法更改此默认功能。
实现你想要的一个技巧是使用片段的setUserVisibleHint
方法。只要片段可见,就会调用它。但是我不推荐你使用这个方法
我正在使用 ViewPager 在作为选项卡的不同片段之间滑动。我注意到仅通过创建适配器,就会立即调用每个片段中的 onCreateView 函数,这不好,因为我想 运行 在特定给定时间这些函数中的代码。
我在 MainActivity 中的代码:
private var profileTab: TabLayout.Tab? = null
private var swipeTab: TabLayout.Tab? = null
private var matchesTab: TabLayout.Tab? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
profileTab = navigationTabs.newTab()
swipeTab = navigationTabs.newTab()
matchesTab = navigationTabs.newTab()
navigationTabs.addTab(profileTab!!)
navigationTabs.addTab(swipeTab!!)
navigationTabs.addTab(matchesTab!!)
val adapter = PagerAdapter(supportFragmentManager, navigationTabs.tabCount)
fragmentContainer.adapter = adapter
我的PagerAdapter.kt代码:
class PagerAdapter (fm: FragmentManager, private val mNoOfTabs: Int) : FragmentStatePagerAdapter(fm, mNoOfTabs) {
override fun getItem(position: Int): Fragment {
when (position) {
0 -> {
return ProfileFragment()
}
1 -> {
return SwipeFragment()
}
2 -> {
return MatchesFragment()
}
}
return null!!
}
override fun getCount() = mNoOfTabs
}
在 activity_main.xml 中(如果重要的话):
<com.google.android.material.tabs.TabLayout
android:id="@+id/navigationTabs"
android:layout_width="match_parent"
android:layout_height="@dimen/navigation_height"
android:background="@drawable/navigation_shadow"
app:layout_constraintTop_toTopOf="parent"
app:tabIndicator="@null"
app:tabMinWidth="@dimen/navigation_height"
app:tabRippleColor="@null" />
<!-- // the fragment will be displayed here:-->
<androidx.viewpager.widget.ViewPager
android:id="@+id/fragmentContainer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="100dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/navigationTabs"/>
这是默认行为吗?能不能阻止,让碎片不会马上启动?
ViewPager 将最少初始化两个片段。
ViewPager 允许我们设置 setOffscreenPageLimit()
,但它至少需要 1,所以它会初始化第一个和下一个片段。
在这里阅读更多 ViewPager.setOffscreenPageLimit(0) doesn't work as expected
尝试通过在MainActivity中设置onPageChangedListener()
来调用fragments中的代码,这样就可以在用户swiped/opened fragment时执行代码。
Android 中的 ViewPager 默认情况下,加载当前片段的另外 2 个片段。这是一个前一个片段和一个下一个片段以实现流畅的动画。而且您无法更改此默认功能。
实现你想要的一个技巧是使用片段的setUserVisibleHint
方法。只要片段可见,就会调用它。但是我不推荐你使用这个方法