【问题标题】:ViewPager switch without showing the in between fragmentsViewPager 切换而不显示片段之间
【发布时间】:2017-12-30 14:29:20
【问题描述】:

我有一个包含 4 个片段的 ViewPager。当我通过单击底部导航栏从 fragment1 切换到 fragment3 或 fragment4 时,它总是显示片段之间的一小部分时间。这种行为就像它必须通过片段 2 和 3 才能到达片段 4。这正常吗?如果是这样,有没有办法在动画之间禁用它?

我的家庭活动中包含 4 个片段的代码如下:

/**
 * view pager.
 */

public void setupViewPager(ViewPager viewPager){
    Log.d(TAG, "setupViewPager: setting up viewPager.");
    SectionsStatePagerAdapter adapter = new SectionsStatePagerAdapter(getSupportFragmentManager());
    adapter.addFragment(new HomeFragment(), "HomeFragment");
    adapter.addFragment(new HashtagFragment(), "HashtagFragment");
    adapter.addFragment(new ChattingFragment(), "ChattingFragment");
    adapter.addFragment(new SettingFragment(), "SettingFragment");
    viewPager.setAdapter(adapter);
}


public void setViewPager(int fragmentNumber){

        mViewPager.setCurrentItem(fragmentNumber);

}



public void enableViewPagerSwitch(){

    mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            if(bottomNavigationView.getMenu().getItem(position).isChecked()){
                bottomNavigationView.getMenu().getItem(position).setChecked(false);
                Log.d(TAG, "onPageScrolled: position is " + position);
            }
        }

        @Override
        public void onPageSelected(int position) {

            bottomNavigationView.getMenu().getItem(position).setChecked(true);

        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

}



/**
 * navigation bar.
 */

private void setupBottomNavigationView(){
    Log.d(TAG, "setupBottomNavigationView: setting up Bottom navigation bar.");
    BottomNavigationViewHelper.setupBottomNavigationView(bottomNavigationView);
    Menu menu = bottomNavigationView.getMenu();
    MenuItem menuItem = menu.getItem(ACTIVITY_NUM);
    menuItem.setChecked(true);
}

private void enableNavigation(){
    bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {

            switch (item.getItemId()){
                case R.id.ic_home:
                    setViewPager(0);
                    break;

                case R.id.ic_hashtag:
                    setViewPager(1);
                    break;

                case R.id.ic_chat:
                    setViewPager(2);
                    break;

                case R.id.ic_setting:
                    setViewPager(3);
                    break;
            }

            return false;
        }
    });

}

ViewPager 适配器:

public class SectionsStatePagerAdapter extends FragmentStatePagerAdapter{

private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();

public SectionsStatePagerAdapter(FragmentManager fm) {
    super(fm);

}

public void addFragment(Fragment fragment, String title){
    mFragmentList.add(fragment);
    mFragmentTitleList.add(title);
}

@Override
public Fragment getItem(int position) {
    return mFragmentList.get(position);
}

@Override
public int getCount() {
    return mFragmentList.size();
}

谢谢!

【问题讨论】:

    标签: android android-fragments android-viewpager bottomnavigationview


    【解决方案1】:

    你可以使用ViewPager#setCurrentItem(position, false);

    第二个布尔值告诉 ViewPager 不要滚动到该项目,而是立即显示它。

    查看文档here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-16
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多