Kotlin FragmentStatePagerAdapter 显示空视图
Kotlin FragmentStatePagerAdapter shows empty views
我正在尝试在片段内设置 ViewPager 适配器以显示另一个片段。问题是当调用 ViewPager 时会自动调用前两个片段,同时只显示空白页。
ViewPager 是这样设置的:
class SwipePagerFragment : Fragment() {
private lateinit var pager: ViewPager
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.fragment_swipe_pager, container, false)
pager = view.findViewById(R.id.fragmentSwipePager_pager)
val pagerAdapter = ScreenSlidePagerAdapter(childFragmentManager)
pager.adapter = pagerAdapter
return view
}
private inner class ScreenSlidePagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm) {
override fun getCount(): Int = 3
override fun getItem(position: Int): Fragment = when (position) {
0 -> MeFragment()
1 -> AccountFragment()
3 -> SearchFragment()
else -> ContactsFragment()
}
}
override fun onDestroyView() {
val frContainer = (activity as MainActivity).findViewById<View>(R.id.activityMain_fragment) as ViewGroup
frContainer.removeAllViews()
super.onDestroyView()
}
}
这是我在 logcat 中得到的:
... D/FRG ME: # onCreateView
... D/FRG Account: # onCreateView
我认为您正尝试在 ViewPager 中添加 4 个片段并提供 getCount() = 3
重写有趣的 getCount(): Int = 4
另外,在 Adapter 中做如下修改,
private inner class ScreenSlidePagerAdapter(fm: FragmentManager) :
FragmentStatePagerAdapter(fm) {
override fun getCount(): Int = 4
override fun getItem(position: Int): Fragment = when (position) {
0 -> MeFragment()
1 -> AccountFragment()
2 -> SearchFragment()
else -> ContactsFragment()
}
}
哦,大声笑,我想通了。
我已经为用于 ViewPager 的 Fragment 设置了如下布局:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
android:id="@+id/fragmentSwipePager_rootScroll"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp"
tools:context=".SwipePagerFragment">
<android.support.v4.view.ViewPager
android:id="@+id/fragmentSwipePager_pager"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</android.support.v4.view.ViewPager>
</ScrollView>
问题出在 ScrollView 的 "layout_height" 属性 中,因为它被设置为 "wrap_content",并且内部没有具有 non-zero 高度的实际内容,导致绘图 zero-height 行并在其中显示 Fragments 内容。将 "layout_height" 更改为 "match_parent" 解决了我的问题。
我正在尝试在片段内设置 ViewPager 适配器以显示另一个片段。问题是当调用 ViewPager 时会自动调用前两个片段,同时只显示空白页。
ViewPager 是这样设置的:
class SwipePagerFragment : Fragment() {
private lateinit var pager: ViewPager
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.fragment_swipe_pager, container, false)
pager = view.findViewById(R.id.fragmentSwipePager_pager)
val pagerAdapter = ScreenSlidePagerAdapter(childFragmentManager)
pager.adapter = pagerAdapter
return view
}
private inner class ScreenSlidePagerAdapter(fm: FragmentManager) : FragmentStatePagerAdapter(fm) {
override fun getCount(): Int = 3
override fun getItem(position: Int): Fragment = when (position) {
0 -> MeFragment()
1 -> AccountFragment()
3 -> SearchFragment()
else -> ContactsFragment()
}
}
override fun onDestroyView() {
val frContainer = (activity as MainActivity).findViewById<View>(R.id.activityMain_fragment) as ViewGroup
frContainer.removeAllViews()
super.onDestroyView()
}
}
这是我在 logcat 中得到的:
... D/FRG ME: # onCreateView
... D/FRG Account: # onCreateView
我认为您正尝试在 ViewPager 中添加 4 个片段并提供 getCount() = 3
重写有趣的 getCount(): Int = 4
另外,在 Adapter 中做如下修改,
private inner class ScreenSlidePagerAdapter(fm: FragmentManager) :
FragmentStatePagerAdapter(fm) {
override fun getCount(): Int = 4
override fun getItem(position: Int): Fragment = when (position) {
0 -> MeFragment()
1 -> AccountFragment()
2 -> SearchFragment()
else -> ContactsFragment()
}
}
哦,大声笑,我想通了。 我已经为用于 ViewPager 的 Fragment 设置了如下布局:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
android:id="@+id/fragmentSwipePager_rootScroll"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp"
tools:context=".SwipePagerFragment">
<android.support.v4.view.ViewPager
android:id="@+id/fragmentSwipePager_pager"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</android.support.v4.view.ViewPager>
</ScrollView>
问题出在 ScrollView 的 "layout_height" 属性 中,因为它被设置为 "wrap_content",并且内部没有具有 non-zero 高度的实际内容,导致绘图 zero-height 行并在其中显示 Fragments 内容。将 "layout_height" 更改为 "match_parent" 解决了我的问题。