如果存在,如何从后台恢复片段

如果存在,如何从后台恢复片段

我正在学习如何使用片段。我有三个例子Fragment在类的顶部初始化。我将片段添加到这样的活动中:


声明和初始化:


Fragment A = new AFragment();

Fragment B = new BFragment();

Fragment C = new CFragment();

替换/添加:


FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

ft.replace(R.id.content_frame, A);

ft.addToBackStack(null);

ft.commit();

这些片段正常工作。每个片段都附加到活动中,并保存到后台堆栈中,没有任何问题。


所以当我发射A, C,然后B,堆栈如下所示:


| |

|B|

|C|

|A|

___

当我按下“后退”按钮时,B被摧毁C已经恢复了。


但是,当我发射片段A第二次,它不是从后台堆栈中恢复,而是添加到后台堆栈的顶部。


| |

|A|

|C|

|A|

___

但我想继续A并摧毁上面的所有碎片(如果有的话)。实际上,我只是喜欢默认的回堆栈行为。


我该如何做到这一点?


预期:(A应恢复原状,销毁顶部的碎片)


| |

| |

| |

|A|

___

编辑:(由A-C建议)


这是我的尝试代码:


private void selectItem(int position) {

        Fragment problemSearch = null, problemStatistics = null;

        FragmentManager manager = getSupportFragmentManager();

        FragmentTransaction ft = manager.beginTransaction();

        String backStateName = null;

        Fragment fragmentName = null;

        boolean fragmentPopped = false;

        switch (position) {

        case 0:

            fragmentName = profile;

            break;

        case 1:

            fragmentName = submissionStatistics;

            break;

        case 2:

            fragmentName = solvedProblemLevel;

            break;

        case 3:

            fragmentName = latestSubmissions;

            break;

        case 4:

            fragmentName = CPExercise;

            break;

        case 5:

            Bundle bundle = new Bundle();

            bundle.putInt("problem_no", problemNo);

            problemSearch = new ProblemWebView();

            problemSearch.setArguments(bundle);

            fragmentName = problemSearch;

            break;

        case 6:

            fragmentName = rankList;

            break;

        case 7:

            fragmentName = liveSubmissions;

            break;

    }

问题是,当我启动A然后B然后按“后退”键,B被移除A已经恢复了。第二次按“后退”键就可以退出应用程序了。但是它显示的是一个空白窗口,我不得不第三次按下才能关闭它。


同时,当我发射A,然后B,然后C,然后B再一次.。


预期:


| |

| |

|B|

|A|

___

实际:


| |

|B|

|B|

|A|

___

我应该覆盖onBackPressed()有什么可定制的还是我漏掉了什么?


幕布斯7119047
浏览 354回答 3
3回答

慕沐林林

步骤1:用活动类实现接口public class AuthenticatedMainActivity extends Activity implements FragmentManager.OnBackStackChangedListener{     @Override     protected void onCreate(Bundle savedInstanceState) {         .............         FragmentManager fragmentManager = getFragmentManager();                    fragmentManager.beginTransaction().add(R.id.frame_container,fragment, "First").addToBackStack(null).commit();     }     private void switchFragment(Fragment fragment){                   FragmentManager fragmentManager = getFragmentManager();       fragmentManager.beginTransaction()         .replace(R.id.frame_container, fragment).addToBackStack("Tag").commit();     }     @Override     public void onBackStackChanged() {     FragmentManager fragmentManager = getFragmentManager();     System.out.println("@Class: SummaryUser : onBackStackChanged "              + fragmentManager.getBackStackEntryCount());     int count = fragmentManager.getBackStackEntryCount();     // when a fragment come from another the status will be zero     if(count == 0){         System.out.println("again loading user data");         // reload the page if user saved the profile data         if(!objPublicDelegate.checkNetworkStatus()){             objPublicDelegate.showAlertDialog("Warning"                     , "Please check your internet connection");         }else {             objLoadingDialog.show("Refreshing data...");              mNetworkMaster.runUserSummaryAsync();         }         // IMPORTANT: remove the current fragment from stack to avoid new instance         fragmentManager.removeOnBackStackChangedListener(this);     }// end if    }       }步骤2:当您调用另一个片段时,添加此方法:String backStateName = this.getClass().getName();FragmentManager fragmentManager = getFragmentManager();fragmentManager.addOnBackStackChangedListener(this); Fragment fragmentGraph = new GraphFragment();Bundle bundle = new Bundle();bundle.putString("graphTag",  view.getTag().toString());fragmentGraph.setArguments(bundle);fragmentManager.beginTransaction().replace(R.id.content_frame, fragmentGraph).addToBackStack(backStateName).commit();
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Android