2016-01-15 54 views
4

我有抽屜式導航菜單結構目前設置爲允許回到以前的fragmnet,與addToBackStack,選擇後退按鈕當:Android的後退按鈕定位到特定的片段

if (menuItem.getItemId() == R.id.nav_item_messages) { 
      FragmentTransaction xfragmentTransaction = mFragmentManager.beginTransaction(); 
      xfragmentTransaction.replace(R.id.containerView, new MessageTabFragment()).addToBackStack("MainActivity").commit(); 
     } 

不過,我想允許後退按鈕始終將用戶發送回特定的幀,而不僅僅是前一幀。

這是如何實現的?

修正

我試圖加入的代碼:

int homeFragmentIdentifier = -1; 

...

  if (menuItem.getItemId() == R.id.nav_item_messages) { 
       FragmentTransaction xfragmentTransaction = mFragmentManager.beginTransaction(); 
       if(homeFragmentIdentifier == -1) { 
        homeFragmentIdentifier = xfragmentTransaction.replace(R.id.containerView, new MessageTabFragment()).commit(); 
       } else { 
        xfragmentTransaction.replace(R.id.containerView, new MessageTabFragment()).commit(); 
       } 

      } 

...

@Override 
public void onBackPressed() { 
    super.onBackPressed(); 

    getFragmentManager().popBackStack(homeFragmentIdentifier, 0); 

} 

但它只是簡單地調用錯誤:

01-15 19:31:55.368 18410-18410/? E/AndroidRuntime: FATAL EXCEPTION: main 
                Process: com.example.android.feastappv2, PID: 18410 
                java.lang.IllegalArgumentException: Bad id: -1 
                 at android.app.FragmentManagerImpl.popBackStack(FragmentManager.java:526) 
                 at com.example.android.feastappv2.feastapp.MainActivity.onBackPressed(MainActivity.java:143) 
                 at android.app.Activity.onKeyUp(Activity.java:2667) 
                 at android.view.KeyEvent.dispatch(KeyEvent.java:3214) 
                 at android.app.Activity.dispatchKeyEvent(Activity.java:2922) 
+1

您仍需調用'xfragmentTransaction.addToBackStack(String)'或'commit()'將始終返回-1。 –

回答

4

在此請看: FragmentManager.popBackStack(int, int)

當你提交你的片段的交易,該方法返回該交易的標識符。保存int標識符:

FragmentTransaction xfragmentTransaction = getFragmentManager().beingTransaction(); 
xfragmentTransaction.replace(R.id.containerView, new MessageTabFragment()); 
xfragmentTransaction.addToBackStack("MainActivity"); 
int homeFragmentIdentifier = transaction.commit(); 

然後,在你的onBackPressed()方法,你可以添加以下行之一:

getFragmentManager().popBackStack(homeFragmentIdentifier, 0); // Exclusive 

getFragmentManager().popBackStack("MainActivity", 0); // Exclusive 

這都將彈出返回堆疊回到提供的標識符的方式。或者,如果要在「pop」中包含homeFragmentIdentifier,而不是0,請使用FragmentManager.POP_BACK_STACK_INCLUSIVE作爲第二個參數。 您仍然必須致電FragmentTransaction.addToBackStack()。根據文檔:

public abstract int commit() ... Returns the identifier of this transaction's back stack entry, if addToBackStack(String) had been called. Otherwise, returns a negative number.

另外,如果你將它添加什麼時候返回堆棧,例如設置片段的標籤:通過提供FragmentManager.popBackStack(String, int)

transaction.add(yourFragment); 
transaction.addToBackStack("[YourFragmentTransactionTag]"); 

您可以使用另一種方法將事務添加到後臺堆棧時使用的標記。

getFragmentManager().popBackStack("[YourFragmentTransactionTag]", 0); 
+0

我在哪裏放置'onBackPressed()'方法? – Sauron

+0

'onBackPressed()'可以在您的活動中被覆蓋。 –

+0

但是當用戶導航到一個片段時,對onBackPressed()的調用將被接受? – Sauron