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); 
      } 
     }