2012-11-01 45 views
8

我有兩個碎片碎片A和碎片B使用視圖尋呼機呈現。 如果用戶已經從A刷到B然後按下返回按鈕(當在B)時,那麼用戶應該去A而不是從視圖尋呼機出來。我們怎樣才能做到這一點?如何使用視圖尋呼機來處理後退按鈕?

將事務添加到backstack似乎沒有幫助。

感謝

回答

20

你必須覆蓋在ActivityonKeyDown()方法。

@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. 
    } 
} 
+0

他可以重寫onBackPressed嗎?還是隻適用於較早的API? –

+0

使用onKeyDown()適用於每個平臺API級別1+。另外,除非我一直在使用它,否則onBackPressed不會阻止Activity從堆棧中彈出。如果你在'onKeyDown()'中返回'true',那麼這將是唯一發生的事件,並且事件將停止級聯。 – DeeV

+0

等一下。剛剛有一個大腦轉儲。 是的。如果他想要定位API 5+,他可以使用onBackPressed()。除非你確定要退出,否則不要調用'super.onBackPressed()'。 – DeeV

0

我認爲一種更好的方法是將後端密鑰處理委託給各個片段。我已經使用了一個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(); 
    } 
}