viewPagerAdapter.getItem返回活动为空的片段

时间:2018-11-05 19:57:08

标签: android kotlin

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内的所有片段中是否保持为空 我没有在设置适配器时附加代码,因为我认为这无关紧要。 您能解释一下为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

这是因为getItem应该)总是创建Fragment的新实例,而不将它们提交给事务。 ViewPagerinstantiateItemgetItem获取片段并将它们提交给事务,它们最终将附加到活动中。

这是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的新实例,那么您的应用程序可能会失败,因为该片段的活动可能无法在配置更改中幸免,例如屏幕旋转。