12

我在我的項目中使用了多個片段。我想要保存片段的狀態並在我回到此狀態時恢復此狀態。在這個片段中,我顯示了多個圖片,這些圖片在點擊按鈕時發生變化我用下面的代碼是:Android片段返回堆棧

String backStateName = fragment.getClass().getName(); 
FragmentManager fragmentManager = getSupportFragmentManager(); 
boolean fragmentPopped = fragmentManager.popBackStackImmediate(backStateName, 0); 
if (!fragmentPopped) { 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
fragmentTransaction.replace(R.id.container_body, fragment); 
fragmentTransaction.addToBackStack(backStateName); 
fragmentTransaction.commit(); 
} 

它工作正常&節省狀態,但它並不顯示以前的形象的。

任何幫助,建議或教程將不勝感激。謝謝。

+0

'fragmentTransaction.addToBackStack(NULL);' –

+0

http://stackoverflow.com/a/15966777/1168654 –

+0

你爲什麼不使用圖像滑行?它會將圖像保存在緩存中 –

回答

1

我與片列表嘗試.. ..

初始化framents列表

static List<String> fragments = new ArrayList<String>(); 

代碼以片段的變化,並採取在後面堆

String backStateName = fragment.getClass().getName(); 
    FragmentManager manager = getSupportFragmentManager(); 
    //fragment not in back stack, create it. 
    FragmentTransaction ft = manager.beginTransaction(); 
    if(!fragments.contains(backStateName)) { 

     // ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
     // ft.setCustomAnimations(R.anim.fade_in, R.anim.fade_out); 
     ft.replace(R.id.frame, fragment); 
     ft.addToBackStack(backStateName); 
     ft.commit(); 

     fragments.add(backStateName); 
     System.out.println("backStateName" + fragments); 
    } 
    else 
    { 


     ft.replace(R.id.frame, fragment); 
     ft.commit(); 

    } 

onBackpressed

@Override 
public void onBackPressed() { 
    if(fragments.size()>0) 
     { 
      fragments.remove(fragments.size()-1); 
     } 
     super.onBackPressed(); 
} 

的背面取下堆棧

final android.app.FragmentManager fm = getFragmentManager(); 

    fm.addOnBackStackChangedListener(new android.app.FragmentManager.OnBackStackChangedListener() { 
     @Override 
     public void onBackStackChanged() { 

      if (getSupportFragmentManager().getBackStackEntryCount() ==0) { 
       // dLayout.closeDrawers(); 
       finish(); 
      } 
      else 
      { 
       // dLayout.closeDrawers(); 

      } 
     } 
    }); 
0

您可以使用下面的代碼。 你什麼時候從以前的片段回它不會重新加載片段:

if (!fragmentPopped) { 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    fragmentTransaction.hide(getFragmentManager().findFragmentById(R.id.container_body)); 
    fragmentTransaction.add(R.id.container_body, fragment); 
    fragmentTransaction.addToBackStack(backStateName); 
    fragmentTransaction.commit(); 
    } 
0

您可以使用

fragmentTransaction.hide(getFragmentManager().findFragmentById(R.id.frame_container)); 
fragmentTransaction.add(R.id.frame_container, fragment); 
fragmentTransaction.addToBackStack(null); 

而不是

fragmentTransaction.replace(R.id.container_body, fragment); 
fragmentTransaction.addToBackStack(backStateName); 
0

我在你MainActivity使用多個片段,這code.Put這段代碼是你的FrameLayout或片段。

@Override  
public void onBackPressed() { 
    /* Fragment fragment = new SettingActivity(); 
    String title = getString(R.string.app_name); 
    FragmentManager fragmentManager = getSupportFragmentManager(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    fragmentTransaction.replace(R.id.container_body, fragment); 
    fragmentTransaction.commit(); 
    // set the toolbar title 
    getSupportActionBar().setTitle(title);*/ 
    //Log.e("title:", getTitle().toString()); 
    getSupportActionBar().setTitle("Home"); 
    //Log.e("title:", getTitle().toString()); 
    if (!getTitle().toString().equals("Home")) { 

     Fragment fragment = new Activity_category(); 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     fragmentManager.beginTransaction() 
       .replace(R.id.container_body, fragment).commit(); 
     this.setTitle("Home"); 
    } else { 

     super.onBackPressed(); 

    } 
} 

願這能幫助你。

0

如果您可以在打開碎片並通過從磁盤緩存讀取顯示圖像時將圖像保存在android磁盤緩存中,則可能會解決您的問題。按照以下鏈接從谷歌如何將圖像保存在磁盤緩存。

https://developer.android.com/training/displaying-bitmaps/cache-bitmap.html

以下是我認爲你應該遵循的步驟。

  1. 將您的圖像存儲在磁盤緩存中。
  2. 將您的ImagesFragment附加到Activity從磁盤緩存中讀取圖像並顯示它們
  3. 當片段從後臺堆棧彈出時,您的代碼將自動從磁盤緩存讀取圖像。

希望這會有所幫助。

0

你把你的碎片放回棧中,所以它沒有你的碎片的錯誤,你需要檢查你的圖像庫。我可以知道你在使用哪個圖書館嗎?我建議使用畢加索圖書館。我也使用這個,並獲得狀態保存圖像在我的片段。

http://square.github.io/picasso/

0

您可以通過下面的代碼做圓形導航。甚至可以連續訪問兩個片段,反之亦然。

FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction(); 
    hideLastFragment(fragmentTransaction); 
    fragmentTransaction.add(R.id.profile_fragmentContainer, youfFragment, fragmentTagName).addToBackStack(fragmentTagName); 
    fragmentTransaction.commitAllowingStateLoss(); 

    /** 
     * To hide the last fragment 
     * 
     * @param fragmentTransaction FragmentTransaction 
     */ 
     public void hideLastFragment(FragmentTransaction fragmentTransaction) { 
      final int backStackCount = getSupportFragmentManager().getBackStackEntryCount() - 1; 
      if (backStackCount >= 0) { 
       String fragmentName = getSupportFragmentManager().getBackStackEntryAt(backStackCount).getName(); 
       Fragment lastFragment = getSupportFragmentManager().findFragmentByTag(fragmentName); 
       fragmentTransaction.hide(lastFragment); 
      } 
     }