这是一个关于从ViewPager的片段进入详细片段的答案。
由于我将ViewPager放在了片段中,使得问题变得有些复杂,如果你愿意,可以跳过这一步并将其添加到活动中。
按照以下步骤操作:
1. 为活动创建布局。
<androidx.coordinatorlayout.widget.CoordinatorLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:popupTheme="@style/ThemeOverlay.AppCompat.ActionBar" />
</com.google.android.material.appbar.AppBarLayout>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragment_container_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
FragmentContainerView
包含了拥有 ViewPager2
的 fragment。
supportFragmentManager.commit {
replace<FragmentThatContainsViewPager>(R.id.fragment_container_view)
}
包含ViewPager的片段布局
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.tabs.TabLayout
android:id="@+id/tabLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:tabMode="scrollable" />
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/tabLayout" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
容器片段的代码
class FragmentThatContainsViewPager : BaseDataBindingFragment<FragmentWithViewpagerBinding>() {
override fun getLayoutRes(): Int {
return R.layout.fragment_with_viewpager
}
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return super.onCreateView(inflater, container, savedInstanceState)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
val tabLayout = dataBinding.tabLayout
val viewPager = dataBinding.viewPager
viewPager.adapter = ChildFragmentStateAdapter(this)
TabLayoutMediator(tabLayout, viewPager) { tab, position ->
tab.text = "Tab $position"
}.attach()
}
}
ViewPager的适配器,如果你希望我使用 FragmentFactory
,你可以使用 GenericFragmentParent.newInstance()。
class ChildFragmentStateAdapter(private val fragment: Fragment) :
FragmentStateAdapter(fragment) {
private val genericFragmentFactory = GenericFragmentFactory.getFragmentFactory()
override fun getItemCount(): Int = 5
override fun createFragment(position: Int): Fragment {
genericFragmentFactory.fragID = position
return genericFragmentFactory.instantiate(
fragment.requireActivity().classLoader,
GenericFragmentParent::class.java.name
)
}
}
class GenericFragmentParent(private val fragID: Int) :
BaseDataBindingFragment<FragmentGenericParentBinding>() {
override fun getLayoutRes(): Int {
return R.layout.fragment_generic_parent
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
dataBinding.btnNextPage.setOnClickListener {
requireActivity().supportFragmentManager.commit {
replace<GenericChildFragment>(R.id.fragment_container_view)
.addToBackStack(null)
}
}
}
}
同时使用后退栈数量来在顶部显示返回箭头。
supportFragmentManager.addOnBackStackChangedListener {
val fragmentOnTop = supportFragmentManager.findFragmentById(
R.id.fragment_container_view
)
val fragmentCount = supportFragmentManager.backStackEntryCount
supportActionBar?.setDisplayHomeAsUpEnabled(fragmentCount > 0)
}
And
override fun onSupportNavigateUp(): Boolean {
supportFragmentManager.popBackStack()
return true
}
当点击返回箭头时删除片段。
我添加了一个示例在这里,它位于MaterialDesign模块中,可能需要为ViewPager选项卡的子片段添加另一个导航示例,每个选项卡都有自己的子片段,而不是打开详细片段,尽管您可以轻松滑动ViewPager2的相邻片段。