从其他片段返回到第二个片段



我在MainActivity中有3个片段,我将第二个片段设置为默认片段(当你启动应用程序时,你会看到第二个片段)。

我想实现一个类似于OnBackPressed()的代码,当用户按下手机的返回按钮时,他/她在第一个或第三个片段,而不是退出应用程序,应用程序返回到第二个应用程序。

MainActivity

public class MainActivity extends AppCompatActivity {
private ViewPager2 mPager; 
private FragmentStateAdapter pagerAdapter;
private int num_page = 3;
private CircleIndicator3 mIndicator;
@Override
protected void onCreate(Bundle savedInstanceState)  {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mPager = findViewById(R.id.viewpager);
pagerAdapter = new MyAdapter(this, num_page);
mPager.setAdapter(pagerAdapter);

mIndicator = findViewById(R.id.indicator);
mIndicator.setViewPager(mPager);
mIndicator.createIndicators(num_page,0);

mPager.setOrientation(ViewPager2.ORIENTATION_HORIZONTAL);
mPager.setCurrentItem(1000, false);
mPager.setOffscreenPageLimit(1);
mPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
super.onPageScrolled(position, positionOffset, positionOffsetPixels);
if (positionOffsetPixels == 0) {
mPager.setCurrentItem(position);
}
}

@Override
public void onPageSelected(int position) {
super.onPageSelected(position);
mIndicator.animatePageSelected(position%num_page);
}
});

mPager.setPageTransformer(new ViewPager2.PageTransformer() {
@Override
public void transformPage(@NonNull View page, float position) {
float myOffset = position;
if (mPager.getOrientation() == ViewPager2.ORIENTATION_HORIZONTAL) {
if (ViewCompat.getLayoutDirection(mPager) == ViewCompat.LAYOUT_DIRECTION_RTL) {
} else {
}
} else {
}
}
});
}
}
page.setTranslationY(myOffset);
page.setTranslationX(-myOffset);
page.setTranslationX(myOffset);

MyAdapter

public class MyAdapter extends FragmentStateAdapter {
public int mCount;
public MyAdapter(FragmentActivity fa, int count) {
super(fa);
mCount = count;
}

@NonNull
@Override
public Fragment createFragment(int position) {
int index = getRealPosition(position);
if (index == 0) return new FragFirst();
else if (index == 1) return new FragSecond();
else return new FragThird();
}

@Override
public int getItemCount() {
return 2000;
}
public int getRealPosition(int position) {
return position % mCount;
}

FragFirst, FragSecond和FragThird

public class FragFirst extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup, container, Bundle savedInstanceState) {
ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.frame_1p, container, false);
}
}

感谢

一般来说,如果您去第1或第3时addToBackStack其交易,那么您可以回到第2时onBackPressed

fragmentManager
.beginTransaction()
.replace(R.id.mainContainer, thirdFragment, ThirdFragment.TAG)
.addToBackStack(null)
.commit();

根据Google的官方培训,您可以在活动中定义onBackPressed:

@Override
public void onBackPressed() {
if (viewPager.getCurrentItem() == 1) {
// If the user is currently looking at the 2nd page, allow the system to handle the
// Back button. This calls finish() on this activity and pops the back stack.
super.onBackPressed();
} else if (viewPager.getCurrentItem() == 0 || viewPager.getCurrentItem() == 2) {
// Select the 2nd page.
viewPager.setCurrentItem(1);
} else {
// There is no such a page number.
throw new IllegalArgumentException();
}
}

(*除上述外,官方培训使用FragmentActivity而不是AppCompatActivity。我不知道这是否与这个问题有关。

相关内容

最新更新