我有一个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”)
将执行,因为firstFragment
为null
,因此没有任何效果。然后大约一秒钟getItem()
个适配器被调用。
所以我的问题是为什么我的viewpager适配器片段没有立即初始化。如果我想念什么,你可以指出。还是ViewPager Adapter的预期行为,那么每当初始化pager时如何使Viewpager片段初始化?
答案 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) {
}
});