Reputation: 6852
I have a ViewPager
with an adapter of FragmentStatePagerAdapter
. For the sake of simplicity I have 2 Fragments within my ViewPager.
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
}
}
My SampleFragment
is a simple Fragment with a TextView
on it's view.
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
}
}
Now I am on my MainActivity where I have ViewPager, I have below lines
val adapter = MyPagerAdapter(supportFragmentManager)
view_pager.adapter = adapter
adapter.firstFragment?.setText("Some Text")
So, here is a problem. After initializing (setting adapter) my ViewPager I expect my fragments are created. But it is not the case. My fragments are initialized after a certain delay. So when I want to set text of TextView inside my fragment with the line
adapter.firstFragment?.setText("Some Text")
firstFragment
is null.
When I debug, I see that after
view_pager.adapter = adapter
getCount()
of adapter is getting called. And then
adapter.firstFragment?.setText("Some Text")
will be executed which doesn't have any effect as firstFragment
is null
. And after a second or so getItem()
of adapter is getting called.
So my question is why is my viewpager adapter fragments aren't getting initialized immediately. If I am missing something could you point out. Or it is expected behavior of ViewPager Adapter then how can I make viewpager fragments get initialized whenever pager is initialized?
Upvotes: 1
Views: 1532
Reputation: 1448
Keep in mind that while creating your adapter, you are running onCreate
from your Activity
.
Fragments views initializations are done only after Activity has finished his own view initialization. So, fragments views are not accessible in onCreate
.
So, to initialize some fragment values you can do this: (code in java, you can change to 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) {
}
});
Upvotes: 1