我使用viewpager在片段之間滑動,並希望後退按鈕導航到先前查看的片段,而不是結束活動。對不起,如果這是this question的重複,但我沒有找到答案非常有幫助。顯然OnBackPressed需要被覆蓋,但我不知道如何獲取並顯示正確的片段。我假設我應該使用fragmentmanager的backstack,但getSupportFragmentManager().getBackStackEntryCount()
總是返回0.我是否需要使用FragmentTransaction.addToBackStack()
手動將碎片添加到backstack?如果是這樣,我會在我的適配器中添加它?在viewpager中使用backstack和後退按鈕
這裏是我的活動代碼,
public class PagerActivity extends FragmentActivity {
ArrayList<Sale> sales;
MyAdapter mAdapter;
ViewPager mPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent it = getIntent();
this.sales = (ArrayList<Sale>) it.getExtras().get("sales");
int position = it.getExtras().getInt("position");
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
setContentView(R.layout.fragment_pager);
mAdapter = new MyAdapter(getSupportFragmentManager());
mPager = (ViewPager) findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
mPager.setCurrentItem(position);
}
public class MyAdapter extends FragmentPagerAdapter {
public MyAdapter(FragmentManager fragmentManager) {
super(fragmentManager);
}
@Override
public int getCount() {
return sales.size();
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
super.destroyItem(container, position, object);
}
@Override
public Fragment getItem(int position) {
SalesThumbFragment frag = new SalesThumbFragment();
return frag.newInstance(sales.get(position));
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.sales_controller, menu);
return true;
}
@Override
public void onBackPressed() {
if(getSupportFragmentManager().getBackStackEntryCount() != 0) {
getSupportFragmentManager().popBackStack();
} else {
super.onBackPressed();
}
}
}
用戶可以在任何方向導航,所以第二個解決方案將無法工作。我剛剛試圖通過添加一個OnPageChangeListener實現第一個解決方案,並在那裏記錄索引,但行爲不一致。有時顯示的頁面不會改變,即使我可以從日誌中看到下一個片段正在被實例化。 – Igd
另外,手動跟蹤索引感覺就像是一個漂亮的'un-android'解決方案,因爲後臺已經存在這個目的 – Igd
嗯,我不知道爲什麼會有這種不一致,但重要的是要注意ViewPager實際上在任何時候都會在內存中實例化3個頁面:當前頁面,前一頁面和下一頁面。因此,如果您當前位於第2頁(第1,2和3頁當前正在實例化),然後轉到第3頁,則第4頁將被實例化並且第1頁將被刪除。 –