为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

幕布斯7119047 2019-07-11 15:01:59
如果存在,如何从后台恢复片段我正在学习如何使用片段。我有三个例子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()有什么可定制的还是我漏掉了什么?
查看完整描述

3 回答

?
慕沐林林

TA贡献2016条经验 获得超9个赞

步骤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();


查看完整回答
反对 回复 2019-07-11
  • 3 回答
  • 0 关注
  • 353 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信