ViewPager 切换而不显示片段之间
ViewPager switch without showing the in between fragments
我有一个包含 4 个片段的 ViewPager。当我通过单击底部导航栏从 fragment1 切换到 fragment3 或 fragment4 时,它总是在片段之间显示一小部分时间。行为就像它必须通过片段 2 和 3 才能到达片段 4。这正常吗?如果是这样,有没有办法在动画之间禁用它?
我家activity中的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();
}
谢谢!
您可以使用ViewPager#setCurrentItem(position, false);
第二个布尔值告诉 ViewPager 不要滚动到该项目,而是立即显示它。
查看文档here
我有一个包含 4 个片段的 ViewPager。当我通过单击底部导航栏从 fragment1 切换到 fragment3 或 fragment4 时,它总是在片段之间显示一小部分时间。行为就像它必须通过片段 2 和 3 才能到达片段 4。这正常吗?如果是这样,有没有办法在动画之间禁用它?
我家activity中的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();
}
谢谢!
您可以使用ViewPager#setCurrentItem(position, false);
第二个布尔值告诉 ViewPager 不要滚动到该项目,而是立即显示它。
查看文档here