【问题标题】:Android Fragment Back StackAndroid 片段回栈
【发布时间】:2016-09-06 07:33:10
【问题描述】:

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

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

它工作正常并保存状态,但它不显示以前的图像。

任何帮助、建议或教程将不胜感激。谢谢。

【问题讨论】:

标签: android android-fragments back-stack savestate fragment-backstack


【解决方案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();

            }
        }
    });

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      你可以使用

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

      【讨论】:

        【解决方案4】:

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

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

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

        1. 将图像存储在磁盘缓存中。
        2. 关于将您的 ImagesFragment 附加到 Activity 从磁盘缓存中读取图像并显示它们
        3. 当片段从后台弹出时,您的代码将自动从磁盘缓存中读取图像。

        希望这会有所帮助。

        【讨论】:

          【解决方案5】:

          我在这段代码中使用了多个片段。把这段代码放在你的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();
          
              }
          }
          

          希望这会对您有所帮助。

          【讨论】:

            【解决方案6】:

            您将片段放入回栈中,因此您需要检查图像库中的片段不会出错。我可以知道您使用的是哪个库。我建议使用毕加索图书馆。我也在使用它并在我的片段中获取状态保存的图像。

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

            【讨论】:

              【解决方案7】:

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

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-10-12
                • 1970-01-01
                • 2014-01-19
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多