2015-07-20 39 views
0

我有一個應用程序,我有3個主屏幕。處理片段過渡:從另一個片段顯示的菜單項

1)家庭

2)網格視圖

3)流查看

流我已是:

  • 您可以從主頁查看到網格視圖
  • 您可以從網格視圖轉到流視圖,反之亦然
  • 當你想從Stream或Grid View返回,你應該登陸Home View。

當我使用菜單選項時,一切都很好。我有以下代碼:

首頁查看到網格視圖(添加主頁查看備份棧)

getFragmentManager().beginTransaction() 
      .replace(R.id.container, gridFragment) 
      .addToBackStack(gridFragment.getTag()) 
      .commit(); 

格來流(不添加網格視圖後退堆棧)。流到網格視圖是類似的。

getFragmentManager().beginTransaction() 
      .replace(R.id.container, streamFragment) 
      .commit(); 

Grid to Home。流到家是類似的:

if (getFragmentManager().getBackStackEntryCount() > 0) { 
       getFragmentManager().popBackStack(); 
    } 

以上所有的工作正常。現在要處理設備上的硬件返回按鈕,我的Activity中有以下方法。

@Override 
    public void onBackPressed() { 
     if (getFragmentManager().getBackStackEntryCount() > 0) { 
     if (GlobalState.getCurrentFragment().class.getSimpleName().equals(
       StreamFragment.class.getSimpleName())) { 
      clearBackStackAndChangeFragment(HomeFragment.newInstance()); 
     } else if (GlobalState.getCurrentFragment().getClass().getSimpleName().equals(
       GridFragment.class.getSimpleName())) { 
      clearBackStackAndChangeFragment(HomeFragment.newInstance()); 
     } else { 
      getFragmentManager().popBackStack(); 
     } 
     } else { 
     super.onBackPressed(); 
     } 
    } 

    public void clearBackStackAndChangeFragment(Fragment fragment) { 
    FragmentManager fm = getFragmentManager(); 
    fm.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); 
    fm.beginTransaction().replace(R.id.container, fragment).commit(); 
    } 

當用戶從首頁 - >併網進入>流 - > ...來回幾次...->首頁通過硬件後退按鈕,我運行到一個問題,即操作欄上的頂層菜單包含來自Grid/Stream視圖的項目。看起來我在處理片段事務時做錯了什麼。

1)我在做什麼錯了?

2)有沒有更簡單更乾淨的方式來做我想做的事情?

回答

0

使用class.tostring(),這不會返回類名,而是返回字符串中的某種對象ID。所以改爲使用 class.getSimpleName()....這將給類名稱,你的代碼檢查可能工作。

另外我的建議是使用視圖分頁器與標籤,而不是片段交易,因爲它更容易處理和維護。

+0

更新了使用getSimpleName()的問題。 – wislo