2017-01-02 78 views
1

對於我的應用程序,某些片段需要用戶在顯示對話框之前在對話框中輸入pin。我有一個BaseFragment類,所有其他片段擴展哪些商店,如果需要引腳。我現在的問題是處理後退按鈕,就好像用戶試圖返回一個片段,它需要首先顯示引腳對話所需的引腳。Android peek backstack without popping

當前我重寫了onBackPressed(),在這個函數中,如果popBackstack()被調用,所以我可以檢查是否應該顯示pin對話框,以查看哪個片段將被恢復。下面是我當前的代碼popFragment回來null:

@Override 
public void onBackPressed() { 
    if(getSupportFragmentManager().findFragmentById(R.id.fragment_container) instanceof BaseFragment) { 
     BaseFragment frag = (BaseFragment) getSupportFragmentManager().findFragmentById(R.id.fragment_container); 

     if (getSupportFragmentManager().getBackStackEntryCount() > 0) { 
      int index = getSupportFragmentManager().getBackStackEntryCount() - 1; 
      Log.e("Back stack", Integer.toString(index)); 
      FragmentManager.BackStackEntry backEntry = (FragmentManager.BackStackEntry) getSupportFragmentManager().getBackStackEntryAt(index); 

      BaseFragment popFragment = (BaseFragment) getSupportFragmentManager().findFragmentById(backEntry.getId()); 

      BaseFragment.checkAuth(this, frag, popFragment, new NavigationCallback((AppCompatActivity) this)); 
     } else { 
      super.onBackPressed(); 
     } 
    } else { 
     super.onBackPressed(); 
    } 
} 

我檢查過,如果backEntry爲空,它不是。 backEntry.getId()也返回值爲1,所以我不知道爲什麼findFragmentById()然後爲空。我也並不認爲它與我如何展示片段做的,但這裏是我的代碼,以及:

FragmentManager fragManager = mActivity.getSupportFragmentManager(); 
FragmentTransaction transaction = fragManager.beginTransaction(); 
transaction.replace(R.id.fragment_container, mFragment); 
transaction.addToBackStack(null); 
transaction.commit(); 

回答

0

BackStackEntry ID和Fragment ID無關彼此。

我已經做了類似於你在做什麼的使用標籤。再次,BackStackEntry標籤和Fragment標籤與對方無關;不過,通過對兩個標籤使用相同的值,您可以完成您的目標。

String tag = ... 
FragmentManager fragManager = mActivity.getSupportFragmentManager(); 
FragmentTransaction transaction = fragManager.beginTransaction(); 
// tag is associated with fragment 
transaction.replace(R.id.fragment_container, mFragment, tag); 
// same tag is associated with back stack entry 
transaction.addToBackStack(tag); 
transaction.commit(); 

...

int count = fragmentManager.getBackStackEntryCount(); 
if (count > 0) { 
    FragmentManager.BackStackEntry topBackStackEntry = 
      fragmentManager.getBackStackEntryAt(count - 1); 
    String tag = topBackStackEntry.getName(); 

    if (tag != null) { 
     Fragment fragment = fragmentManager.findFragmentByTag(tag); 
     if (fragment != null) { 
      // we found the fragment 
      // you can also sanity-check here with fragment.isResumed() 
     } 
    } 
} 
+0

你碰上,你有多個片段,在返回堆棧相同標籤的問題?如果爲標籤生成隨機名稱,我很好奇。 –

+0

我只是設置了一個創建標籤的約定,以確保它們在任何可能的背堆棧排列中都是唯一的。在我的情況下,由於應用程序的設計,只使用片段的類名就足夠了。生成一個隨機標籤應該可以工作,只要你可以保證標籤永遠不會在後退堆棧中被複制。 –

+0

同樣在我的情況下,我只需要知道是否有四種片段類型當前處於活動狀態,因爲像您的應用程序一樣,他們需要知道後退按鈕是否已被按下。所以我的大部分片段交易甚至都沒有指定標籤。 –