class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
Log.d("ACTIVITY MAIN", "CREATED")
setupViewPager(bottom_nav)
}
private fun setupViewPager(bottomNavigationView: BottomNavigationView) {
val viewPagerAdapter = ViewPagerAdapter(supportFragmentManager)
val trainingFragment = TrainingFragment()
val magicMileFragment = MagicMileFragment()
val tournamentFragment = TournamentFragment()
viewPagerAdapter.add(trainingFragment)
viewPagerAdapter.add(magicMileFragment)
viewPagerAdapter.add(tournamentFragment)
bottomNavigationView.setOnNavigationItemSelectedListener {
when (it.itemId) {
R.id.magicMileFragment -> {
viewpager.currentItem = 1
if(viewPagerAdapter.getItem(1).activity == null)
Log.d("NULL ACTIVITY", "NULLL")
}
R.id.trainingFragment -> {
viewpager.currentItem = 0
}
R.id.tournamentFragment -> {
viewpager.currentItem = 2
}
}
false
}
我在bottomNavigation.setOnNavigationItemSelectedListener
中的viewPagerAdapter
中的片段有问题。
更改方向后,此条件:if(viewPagerAdapter.getItem(1).activity == null)
为true
。
我检查了活动在viewPagerAdapter
内的所有片段中是否保持为空
我没有在设置适配器时附加代码,因为我认为这无关紧要。
您能解释一下为什么会这样吗?
答案 0 :(得分:1)
这是因为getItem
(应该)总是创建Fragment
的新实例,而不将它们提交给事务。 ViewPager
从instantiateItem
或getItem
获取片段并将它们提交给事务,它们最终将附加到活动中。
这是FragmentPagerAdapter.instantiateItem
的代码段:
@Override
public Object instantiateItem(ViewGroup container, int position) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
final long itemId = getItemId(position);
// Do we already have this fragment?
String name = makeFragmentName(container.getId(), itemId);
Fragment fragment = mFragmentManager.findFragmentByTag(name);
if (fragment != null) {
if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
mCurTransaction.attach(fragment);
} else {
fragment = getItem(position);
if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
mCurTransaction.add(container.getId(), fragment,
makeFragmentName(container.getId(), itemId));
}
if (fragment != mCurrentPrimaryItem) {
fragment.setMenuVisibility(false);
fragment.setUserVisibleHint(false);
}
return fragment;
}
ViewPager
调用instantiateItem
以获取片段,并在该方法内检查片段是否存在,然后返回这些片段,否则调用getItem
以创建它们的新实例。
这说明了为什么您在getItem
上的活动为空。但是,如果您的getItem
不(<总是> )返回Fragment
的新实例,那么您的应用程序可能会失败,因为该片段的活动可能无法在配置更改中幸免,例如屏幕旋转。