Android片段后栈

Android片段后栈,android,android-fragments,back-stack,savestate,fragment-backstack,Android,Android Fragments,Back Stack,Savestate,Fragment Backstack,我在我的项目中使用了多个片段。我想保存一个片段的状态,当我回到这里时恢复这个状态。在这个片段中,我展示了多个在点击按钮时改变的图像。为此,我使用以下代码: String backStateName = fragment.getClass().getName(); FragmentManager fragmentManager = getSupportFragmentManager(); boolean fragmentPopped = fragmentManager.popBackStackIm

我在我的项目中使用了多个片段。我想保存一个片段的状态,当我回到这里时恢复这个状态。在这个片段中,我展示了多个在点击按钮时改变的图像。为此,我使用以下代码:

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();
}
它工作正常&它保存状态,但不显示以前的图像


任何帮助、建议或指导都将不胜感激。谢谢。

您可以使用以下代码。 当您从上一个片段返回时,它不会重新加载片段:

    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();
    }
你可以用

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

我正在尝试碎片列表

初始化框架列表

背压

对于后移除堆栈


我在这段代码中使用了多个片段。请将这段代码放在您的
main活动中

@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();

    }
}

愿这对你有帮助

如果您可以在打开片段时将图像保存在android磁盘缓存中,并通过从磁盘缓存读取来显示图像,则可能会解决您的问题。请按照下面的谷歌链接,了解如何在磁盘缓存中保存图像

以下是我认为你应该遵循的步骤

  • 将图像存储在磁盘缓存中
  • 将ImagesFragment附加到活动从磁盘缓存读取图像并显示它们
  • 当片段从backbackback中弹出时,您的代码将自动从磁盘缓存中读取图像

  • 希望这能有所帮助。

    您将片段放在后堆栈中,这样就不存在片段的错误,您需要在图像库中进行检查。我可以知道你在用哪个图书馆吗。我建议使用毕加索图书馆。我也在使用它,并在片段中获得状态保存的图像

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

    您可以使用下面的代码进行循环导航。您甚至可以访问两个片段,反之亦然

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

    fragmentTransaction.addToBackStack(空)为什么不使用glide进行图像处理?它会将图像保存在缓存中
    
     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();
    
                }
            }
        });
    
    @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();
    
        }
    }
    
    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);
                }
            }