安卓碎片返回栈

12

我在我的项目中使用了多个碎片。我想保存一个碎片的状态,并在我回到这里时恢复这个状态。在这个碎片中,我展示了多张图片,这些图片在按钮点击时会改变。我使用以下代码实现:

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

它能够正常工作且保存状态,但无法显示以前的图片。

非常感谢任何帮助、建议或教程。谢谢。


fragmentTransaction.addToBackStack(null); - IntelliJ Amiya
https://dev59.com/uOo6XIcBkEYKwwoYNBln#15966777 - Dhaval Parmar
为什么不使用Glide来处理图片?它可以将图片保存在缓存中。 - H Raval
7个回答

1
我将尝试处理片段列表...

初始化片段列表

  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

你将你的片段放入了后退栈,所以这不是你的片段的问题,你需要检查你的图像库。请问你使用的是哪个库?我建议使用 Picasso 库。我也在使用它,并在我的片段中获取保存状态的图像。

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


0

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

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

以下是我认为你应该遵循的步骤:
  1. 将图像存储在磁盘缓存中。
  2. 在将ImagesFragment附加到Activity时,从磁盘缓存中读取图像并显示它们
  3. 当片段从后堆栈中弹出时,您的代码将自动从磁盘缓存中读取图像。
希望这可以帮助到你。

0

我使用了多个片段来编写这段代码。将此代码放入您的MainActivity中,其中包含您的帧布局或片段。

@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
您可以使用以下代码进行循环导航。您可以通过无限制地来回访问两个片段。
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);
            }
        }

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接