我有兩個碎片碎片A和碎片B使用視圖尋呼機呈現。 如果用戶已經從A刷到B然後按下返回按鈕(當在B)時,那麼用戶應該去A而不是從視圖尋呼機出來。我們怎樣才能做到這一點?如何使用視圖尋呼機來處理後退按鈕?
將事務添加到backstack似乎沒有幫助。
感謝
我有兩個碎片碎片A和碎片B使用視圖尋呼機呈現。 如果用戶已經從A刷到B然後按下返回按鈕(當在B)時,那麼用戶應該去A而不是從視圖尋呼機出來。我們怎樣才能做到這一點?如何使用視圖尋呼機來處理後退按鈕?
將事務添加到backstack似乎沒有幫助。
感謝
你必須覆蓋在Activity
的onKeyDown()
方法。
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
myViewPager.setCurrentItem(0, true);
return true;
} else {
return super.onKeyDown(keyCode, event);
}
}
這將捕獲「返回」按鈕按下事件並將用戶發送到ViewPager中的第一項。
還有ViewPager#getCurrentItem()只有當用戶刷卡時才能用於返回。像這樣的實現:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && myViewPager.getCurrentItem() == 1) {
myViewPager.setCurrentItem(0, true);
return true;
} else {
return super.onKeyDown(keyCode, event);
}
}
將用戶發送回以前的頁面,只有當用戶是下一個頁面上。否則,它將正常註冊「返回」,用戶將按預期退出。
您可能希望用戶返回上一頁的情況(假設您的頁面超過兩頁)。在這種情況下,您需要實施ViewPager.OnPageChangeListener()並每次調用onPageSelected(int position)
時都保存該位置。如果您將它們疊放在一起,那麼每次用戶按下「後退」時都可以將它們彈出。一旦堆棧爲空,退出應用程序。
編輯
爲在玉拜菲爾德,一個稍微容易的方式做這將是在活動使用onBackPressed()
的意見正確地指出。這隻適用於5+以上的API。
@Override
public void onBackPressed() {
if(i_dont_want_to_leave) {
myViewPager.setCurrentItem(0, true);
} else {
super.onBackPressed(); // This will pop the Activity from the stack.
}
}
我認爲一種更好的方法是將後端密鑰處理委託給各個片段。我已經使用了一個CustomFragment,它支持一種方法來處理返回鍵。所有碎片將從這個CustomFragment擴展。
public abstract class BackKeyHandlingFragment extends Fragment {
public abstract boolean handleBackKey();
}
活動可以將backKey處理委託給當前Fragment。碎片可以在其各自的handleBackKey方法的執行中執行所需的操作。該方法可以返回true來告訴活動不處理返回鍵。要繼續執行Activity級別的默認後退鍵操作,該方法可以返回false。
public void onBackPressed() {
BackKeyHandlingFragment fragment = (BackKeyHandlingFragment) mSectionsPagerAdapter.getItem(mViewPager.getCurrentItem());
// Fragment should return boolean according to app requirements after processing back key
if (!fragment.handleBackKey()) {
super.onBackPressed();
}
}
在Android文檔頁面
https://developer.android.com/training/animation/screen-slide.html#viewpager
我發現的處理ViewPager
滑動的例子,有一個方法
@Override
public void onBackPressed() {
if (mPager.getCurrentItem() == 0) {
super.onBackPressed();
}
else {
mPager.setCurrentItem(mPager.getCurrentItem() - 1);
}
}
這將選擇前一頁面或退出活性活性。
他可以重寫onBackPressed嗎?還是隻適用於較早的API? –
使用onKeyDown()適用於每個平臺API級別1+。另外,除非我一直在使用它,否則onBackPressed不會阻止Activity從堆棧中彈出。如果你在'onKeyDown()'中返回'true',那麼這將是唯一發生的事件,並且事件將停止級聯。 – DeeV
等一下。剛剛有一個大腦轉儲。 是的。如果他想要定位API 5+,他可以使用onBackPressed()。除非你確定要退出,否則不要調用'super.onBackPressed()'。 – DeeV