【问题标题】:Kotlin FragmentStatePagerAdapter shows empty viewsKotlin FragmentStatePagerAdapter 显示空视图
【发布时间】:2019-06-20 19:57:38
【问题描述】:

我正在尝试在片段中设置 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

【问题讨论】:

    标签: kotlin android-viewpager fragment


    【解决方案1】:

    我认为您正在尝试在 ViewPager 中添加 4 个片段并提供 getCount() = 3

    覆盖 fun 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()
        }
    }
    

    【讨论】:

    • 问题在于,与我在 FragmentStatePagerAdapter 中设置的片段数量无关,它在从 getItem 调用前两个片段时仅显示空白页面(正如我从 Logcat 中看到的那样)。上面的代码给出了相同的结果。
    【解决方案2】:

    哦,哈哈,我想通了。 我为 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”,并且其中没有具有非零高度的实际内容,导致绘制零高度线并在其中显示片段内容。将“layout_height”更改为“match_parent”解决了我的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-10
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-20
      相关资源
      最近更新 更多