2012-10-03 120 views
6

我正在使用ViewPager在我的Android应用程序中实现滑动。但是,我希望在用户使用后退按钮而不是结束活动时显示上一个片段。有没有办法做到这一点? 感谢 塞巴斯蒂安与ViewPager一起使用backstack

回答

4

覆盖你Activity的功能:

public class Activity extends Activity 
{ 
    @Override 
    public void onBackPressed() 
    { 
     // do stuff 
     myFragment.onBackPressed(); 
    } 
} 

public class Fragment extends Fragment 
{ 

    public void onBackPressed() 
    { 
     // do stuff 
    } 
} 
+0

完美,非常感谢! – Sebastian

4

我也有类似的问题,这是我如何解决它。我有一个ViewPager 6片段,并希望跟踪页面历史记录,并能够使用后退按钮在历史中向后导航。我创建一个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; 
    } 
}; 
1

我有同样的问题,我按照此步骤(编辑我的回答---我当然工作,试试看

在主要活动在viewpager中有3个片段,我创建堆栈 和推送和弹出数据。

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) { 
     } 
    }); 
} 

,并在onBackPressed的活动,

//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 { 
    } 
} 

希望这可以帮助或消息我。

+0

尽管这个链接可能回答这个问题,但最好在这里包含答案的基本部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 –

+0

@JaiprakashSoni谢谢你的建议。我编辑了我的答案。希望这可以帮助其他人 –

相关问题