2016-02-26 51 views
1

我有一個工作正常的Android應用程序,但我發現了一個煩人的錯誤,我不知道還有什麼辦法來解決它。通過片段返回後的白色屏幕

我的應用程序有一個單獨的Activity(稱爲HomeActivity;還有,首選活動)和大量碎片。 HomeActivity管理使用此方法(在此thread,尤其是發現尋找到以下comment)更換每個片斷:

public void switchFragment(Fragment pFragment, String pTagFragment){ 

    String backStateName = pTagFragment; 
    boolean fragmentPopped = mFragmentManager.popBackStackImmediate (backStateName, 0); 

    if (!fragmentPopped){ //fragment not in back stack, create it. 
     FragmentTransaction ft = mFragmentManager.beginTransaction(); 
     ft.replace(R.id.content_frame, pFragment); 
     ft.addToBackStack(backStateName); 
     ft.commit(); 
    } 

} 

要更換一個片段,我做的是以下幾點:

switchFragment(new FragmentEuskalmet(), FragmentEuskalmet.FRAGMENT_NAME); 

這是問題所在:我瀏覽了幾個片段(比如說其中的3個片段)。然後,我想回去,所以我回推2次。當我到達堆棧中的最後一個時,顯示一個白色屏幕(即在碎片應該在的地方顯示白色)。奇怪的是,如果我長時間按住我的主頁按鈕來顯示最近的應用程序,並再次選擇我的應用程序,則片段將正確加載。

我假設在我的switchFragment方法中可能存在某些內容,例如,它可能是與backStack有關的任何問題。一個重要的細節是我已經在每個片段中寫入了所謂的空構造函數。

有人能幫我一把嗎?如果有人要求,我可以提供更多的代碼片段。

編輯: 我認爲強制輸入我的SSS方法:

@Override 
public void onBackPressed(){ 
    invalidateOptionsMenu(); 
    if(CURRENT_FRAGMENT != FragmentMapa.FRAGMENT_NAME){//"com.ingartek.bizkaimove.ui.FragmentMapa"){ 
     mDrawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, mDrawerRightRelativeLayout); 
    } 

    if(mDrawer.isDrawerOpen(GravityCompat.START)){ 
     mDrawer.closeDrawer(GravityCompat.START); 
     setToolbarSubtitle(mSubtitleAux); 
    }else{ 
     setToolbarSubtitle(getString(R.string.app_name_subtitle)); 
     if (getSupportFragmentManager().getBackStackEntryCount() == 1){ 
      //finish(); 
      showExitDialog(); 
     }else { 
      super.onBackPressed(); 
      popFragment(); 
     } 
    } 

} 

我想我應該改寫這一部分:

}else { 
    super.onBackPressed(); 
    popFragment(); 
} 

解決方案: 作爲@Ajay潘迪亞建議,我離開onBackPressed()那樣:

@Override 
public void onBackPressed(){ 
    invalidateOptionsMenu(); 
    if(CURRENT_FRAGMENT != FragmentMapa.FRAGMENT_NAME){//"com.ingartek.bizkaimove.ui.FragmentMapa"){ 
     mDrawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, mDrawerRightRelativeLayout); 
    } 

    if(mDrawer.isDrawerOpen(GravityCompat.START)){ 
     mDrawer.closeDrawer(GravityCompat.START); 
     setToolbarSubtitle(mSubtitleAux); 
    }else{ 
     setToolbarSubtitle(getString(R.string.app_name_subtitle)); 
     if (getSupportFragmentManager().getBackStackEntryCount() > 0) { 
      if (getSupportFragmentManager().getBackStackEntryCount() == 1){ 
       //finish(); 
       showExitDialog(); 
      }else{ 
       mFragmentManager.popBackStackImmediate(); 
      } 
     } else { 
      super.onBackPressed(); 
     } 
    } 

} 
+1

你應該在這裏發表您的活動了解更多信息。白色屏幕顯示您添加到背面堆疊的所有碎片都被剪切 - >因此,您的活動中沒有視圖。 –

回答

2

您可以管理後退堆棧和屏幕出境像

@Override 
public void onBackPressed() { 
    if (getSupportFragmentManager().getBackStackEntryCount() > 0) { 
     getSupportFragmentManager().popBackStack(); 
    } else { 
     super.onBackPressed(); 
    } 
} 
3

這是因爲您正在以編程方式添加所有片段。在按下按鈕後,最終移除您添加的第一個片段。

您啓動應用程序時重新啓動它的原因是因爲您再次添加片段。

我會建議覆蓋你的後退按鈕。每當你彈出片段時,檢查看看它不是你的第一個片段,然後彈出它。

+1

請參閱此處的答案以獲取更多詳細信息。 http://stackoverflow.com/a/35354094/1891327 –

+1

你的回答並沒有直接解決我的問題,但它給了我,「啊哈!」時刻。我用片段管理器使用'.replace()'而不是'.add()'。彈出後臺堆棧無法顯示我以前的片段,因爲沒有一個。我用我的新片段替換它! – levibostian