ViewPager片段未立即初始化

时间:2019-04-25 01:22:09

标签: android android-fragments kotlin android-viewpager

我有一个ViewPager,适配器为FragmentStatePagerAdapter。为了简单起见,我的ViewPager中有2个片段。

class MyPagerAdapter(fragmentManager: FragmentManager): FragmentStatePagerAdapter(fragmentManager) {
    var firstFragment: SampleFragment? = null
    var secondFragment: SampleFragment? = null

    override fun getItem(position: Int): Fragment {
        return when(position) {
            0 -> SampleFragment()
                .also { firstFragment = it }
            1 -> SampleFragment()
                .also { secondFragment = it }
            else -> Fragment()
        }
    }

    override fun getCount(): Int {
        return 2
    }

}

我的SampleFragment是一个简单的片段,其视图上带有TextView

class SampleFragment: Fragment() {
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return inflater.inflate(R.layout.fragment_sample, container, false)
    }

    fun setText(text: String) {
        text_view.text = text
    }
}

现在我在MainActivity上,我有ViewPager,下面几行

val adapter = MyPagerAdapter(supportFragmentManager)
view_pager.adapter = adapter

adapter.firstFragment?.setText("Some Text")

所以,这是一个问题。初始化(设置适配器)我的ViewPager之后,我希望创建片段。但事实并非如此。经过一段时间的延迟后,我的片段被初始化了。因此,当我想用​​行将片段中的TextView文本设置为

adapter.firstFragment?.setText("Some Text")

firstFragment为空。

当我调试时,我会在之后看到

view_pager.adapter = adapter
适配器的

getCount()被调用。接着 adapter.firstFragment?.setText(“ Some Text”) 将执行,因为firstFragmentnull,因此没有任何效果。然后大约一秒钟getItem()个适配器被调用。

所以我的问题是为什么我的viewpager适配器片段没有立即初始化。如果我想念什么,你可以指出。还是ViewPager Adapter的预期行为,那么每当初始化pager时如何使Viewpager片段初始化?

1 个答案:

答案 0 :(得分:1)

请记住,在创建适配器时,您正在onCreate中运行Activity。 仅在Activity完成自己的视图初始化之后,才完成片段视图的初始化。因此,无法在onCreate中访问片段视图。

因此,要初始化一些片段值,可以执行以下操作: (使用Java代码,您可以更改为Kotlin ...)

    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int i, float v, int i1) {
        }

        @Override
        public void onPageSelected(int i) {
            switch (i) {
                case 0:
                   // init for first fragment
                break;   
                case 1:
                   // init for second fragment
                break; 
            }
        }

        @Override
        public void onPageScrollStateChanged(int i) {

        }
    });