我正在使用ViewPager在我的安卓应用程序中实现左右滑动功能。然而,当用户使用返回按钮时,我希望显示先前的碎片而不是结束活动。有没有什么办法可以做到这一点? 谢谢 Sebastian
我正在使用ViewPager在我的安卓应用程序中实现左右滑动功能。然而,当用户使用返回按钮时,我希望显示先前的碎片而不是结束活动。有没有什么办法可以做到这一点? 谢谢 Sebastian
java.util.Stack<Integer>
对象,将片段编号添加到其中(除非您使用返回按钮,请参见下文),并覆盖 onBackPressed()
方法,使其在我的历史堆栈不为空时弹出最后查看的片段,而不是使用返回堆栈。MyAdapter mAdapter;
ViewPager mPager;
Stack<Integer> pageHistory;
int currentPage;
boolean saveToHistory;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mAdapter = new MyAdapter(getSupportFragmentManager());
mPager = (ViewPager)findViewById(R.id.container);
mPager.setAdapter(mAdapter);
mPager.setOffscreenPageLimit(5);
pageHistory = new Stack<Integer>();
mPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
if(saveToHistory)
pageHistory.push(Integer.valueOf(currentPage));
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
saveToHistory = true;
}
@Override
public void onBackPressed() {
if(pageHistory.empty())
super.onBackPressed();
else {
saveToHistory = false;
mPager.setCurrentItem(pageHistory.pop().intValue());
saveToHistory = true;
}
};
@Override
public void onBackPressed() {
if (mViewPager.getCurrentItem() == 0) {
// If the user is currently looking at the first step, allow the system to handle the
// Back button. This calls finish() on this activity and pops the back stack.
super.onBackPressed();
} else {
// Otherwise, select the previous step.
mViewPager.setCurrentItem(mViewPager.getCurrentItem() - 1);
}
}
覆盖您的Activity
的功能:
public class Activity extends Activity
{
@Override
public void onBackPressed()
{
// do stuff
myFragment.onBackPressed();
}
}
public class Fragment extends Fragment
{
public void onBackPressed()
{
// do stuff
}
}
private Stack<Integer> stackkk;
private ViewPager mPager;
private int tabPosition = 0;
mTabLayout.setupWithViewPager(mPager);
mPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout));
mTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
tabPosition = tab.getPosition();
mPager.setCurrentItem(tab.getPosition());
// here i have add the data into the stack in each tab click, as at first it will always be null so i add 0 position
if (stackkk.empty())
stackkk.push(0);
if (stackkk.contains(tabPosition)) {
stackkk.remove(stackkk.indexOf(tabPosition));
stackkk.push(tabPosition);
} else {
stackkk.push(tabPosition);
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
tabPositionUnselected = tab.getPosition();
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
//OnbackPress i have first taken out the last one as it already and
//selected by poping it out then only set to the pager.
@Override
public void onBackPressed() {
if (stackkk.size() > 1) {
stackkk.pop();
mPager.setCurrentItem(stackkk.lastElement());
} else {
}
}
参考 @Piero Nicolli 的 Kotlin 代码
这个答案的工作方式与 Instagram 导航相同,一旦您访问了相同的选项卡,您就不会再次访问它。
val pageHistory = Stack<Int>()
var saveToHistory = false
var viewPager: ViewPager? = null
如果您正在Fragment中使用ViewPager,则在OnCreate或OnCreateView内部
viewPager?.adapter = viewPagerAdapter
pageHistory.push(0);
viewPager?.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
override fun onPageScrolled(
position: Int,
positionOffset: Float,
positionOffsetPixels: Int,
) {
}
override fun onPageSelected(position: Int) {
if (saveToHistory) {
if (pageHistory.contains(position)) {
pageHistory.remove(position)
pageHistory.push(position);
} else {
pageHistory.push(position);
}
}
}
override fun onPageScrollStateChanged(state: Int) {
}
})
saveToHistory = true;
requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner) {
// Handle the back button event
Log.i(TAG, "pageHistory size ${pageHistory.size}")
if (pageHistory.size > 1) {
saveToHistory = false;
pageHistory.pop()
viewPager?.currentItem = pageHistory.peek()
saveToHistory = true;
} else {
Log.i(TAG, "pageHistory inside 0 size ${pageHistory.size}")
if(pageHistory.size ==1){
pageHistory.pop()
}
if (viewPager?.currentItem == 0){
requireActivity().finish()
}else{
viewPager?.currentItem = 0
}
}
}
由于我正在使用Fragment,因此可以使用onBackPressedDispatcher回调函数来处理返回按钮。 如果您在Activity中使用viewpager,则将代码从onBackPressedDispatcher()复制到onBackPressed()中。
currentPage
值从未被设置。 我通过使用一个名为lastPage
的变量来解决这个问题,并在推入堆栈后将其设置为onPageSelected
的参数。arg0
是正在导航到的页面,因此我们需要使用该变量来跟踪“上一页”。即使saveToHistory
为 false,也应更新lastPage
。 - Trex