博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家,
👉点击跳转到教程
效果
使用的布局如下:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ViewPagerActivity">
<com.google.android.material.tabs.TabLayout
android:id="@+id/tableLayout"
android:layout_width="match_parent"
android:layout_height="50dp"
app:layout_constraintTop_toTopOf="parent"
app:tabGravity="center"
app:tabIndicatorColor="@color/black"
app:tabMode="fixed"
app:tabSelectedTextColor="@color/black"
app:tabTextColor="#7D7D7D" />
<androidx.viewpager.widget.ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@id/tableLayout" />
</androidx.constraintlayout.widget.ConstraintLayout>
ViewPager通过FragmentPagerAdapter派生自PagerAdapter,来呈现 Fragment页面。
ViewPagerAdapter代码如下
class ViewPagerAdapter(val fragmentManager: FragmentManager, val listFragment: List<Fragment>) :
FragmentPagerAdapter(fragmentManager) {
private val titles = arrayOf("标签一", "标签二")
override fun getCount() = listFragment.size
override fun getItem(position: Int) = listFragment[position]
override fun getPageTitle(position: Int) = titles[position]
}
这里我们想要探讨的是生命周期这块,如上所示我们是继承的带一个参数的FragmentPagerAdapter,但是已经被废弃了,内部其实实现的是
@Deprecated
public FragmentPagerAdapter(@NonNull FragmentManager fm) {
this(fm, BEHAVIOR_SET_USER_VISIBLE_HINT);
}
BEHAVIOR_SET_USER_VISIBLE_HINT:这个行为在 FragmentPagerAdapter 中已经过时。它会在每个 Fragment 被设置为用户可见或不可见时调用 setUserVisibleHint() 方法。
我们首次加载该页面会执行如下方法:
可见首次加载都会执行Fragment的onResume()方法。
当我们在切换标签页的时候,生命周期方法也没有再次执行,因为已经加载过了。
我们现在使用最新的AndroidX中,尽量使用该行为BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT
此行为表示只有当前可见的 Fragment 会调用其 onResume() 和 onPause() 方法。因为它会在 ViewPager 切换时仅保留当前 Fragment 的生命周期状态,以提高性能。
class ViewPagerAdapter(val fragmentManager: FragmentManager, val listFragment: List<Fragment>) :
FragmentPagerAdapter(fragmentManager,BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
private val titles = arrayOf("标签一", "标签二")
override fun getCount() = listFragment.size
override fun getItem(position: Int) = listFragment[position]
override fun getPageTitle(position: Int) = titles[position]
}
首次进入该页面会执行如下方法:
先执行了标签一的onResume()方法,标签二的onResume()方法并没有执行。
当我们点击标签二会执行如下方法
再次切换同理。