2013-07-05 87 views
0

我有一個標籤欄在我的應用程序中有幾個按鈕,並且這些按鈕有一個片段。點擊按鈕後,我隱藏當前顯示的一個,然後顯示與點擊按鈕對應的片段。一切都好,但有時當我從其他活動返回或在後臺有更長時間的應用程序時,我會看到所有這些碎片堆疊在自己身上。Android應用程序失去其碎片狀態

這種行爲的原因是什麼,請問我該如何解決?

更新1:

這是我如何與恢復實例狀態

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 
} 

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 

    mCurrentTab = 0; 

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 

    if (fragment1 != null) 
     ft.show(fragment1); 
    if (fragment2 != null) 
     ft.hide(fragment2); 
    if (fragment3 != null) 
     ft.hide(fragment3); 
    if (fragment4 != null) 
     ft.hide(fragment4); 
    if (fragment5 != null) 
     ft.hide(fragment5); 

    ft.commit(); 
} 

,並在這裏onTabbarButtonClick是開關片段(所有按鈕具有相同的監聽器)

@Override 
public void onClick(View v) { 
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 

    // hide only what is needed and when it is needed 
    // for example when user clicks currently selected tab then nothing is done 
    switch (mCurrentTab) { 
    case 1: 
     if (v.getId() != R.id.btn1) 
      ft.hide(fragment1); 
     break; 
    case 2: 
     if (v.getId() != R.id.btn2) 
      ft.hide(fragment2); 
     break; 
    case 3: 
     if (v.getId() != R.id.btn3) 
      ft.hide(fragment3); 
     break; 
    case 4: 
     if (v.getId() != R.id.btn4) 
      ft.hide(fragment4); 
     break; 
    case 5: 
     if (v.getId() != R.id.btn5) 
      ft.hide(fragment5); 
     break; 
    } 

    // show only what is needed and when it is needed 
    switch (v.getId()) { 
    case R.id.btn1: 
     if (mCurrentTab != 1) { 
      mCurrentTab = 1; 
      ft.show(fragment1); 
     } 
     break; 
    case R.id.btn2: 
     if (mCurrentTab != 2) { 
      mCurrentTab = 2; 
      ft.show(fragment2); 
     } 
     break; 
    case R.id.btn3: 
     if (mCurrentTab != 3) { 
      mCurrentTab = 3; 
      ft.show(mFavoritesFragment3); 
     } 
     break; 
    case R.id.btn4: 
     if (mCurrentTab != 4) { 
      mCurrentTab = 4; 
      ft.show(fragment4); 
     } 
     break; 
    case R.id.btn5: 
     if (mCurrentTab != 5) { 
      mCurrentTab = 5; 
      ft.show(fragment5); 
     } 
     break; 
    } 

    ft.commit(); 
} 

回答

0

工作我不是100%確定的,但通常這些問題是由您的活動中傳遞的savedInstanceState造成的:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

當你這樣做,你也傳遞這可能不是與你實現了碎片的方式(你還沒有表現出任何代碼,所以實在看不出來),工作也很好的片段。你可以試着簡單地使用super.onCreate(null);,但是你每次都會從頭創建一切。

或者,你應該正確地記住你的碎片的狀態,並在初始化時設置它。

+0

您好,感謝您迴應:)我已經編輯我的答案與我的應用程序中的一些代碼示例。我做到了嗎? – bakua