search

Home  >  Q&A  >  body text

android - 单activity+多fragment场景,应用长时间在后台进入前台时,fragment全部是空白

1,问题:
应用长期在后台的场景下,进入前台时,fragment显示为空白
2,app框架大体实现:
1个activity+多个Fragment,使用的是add()方法以及 hide(),show()方法,显示fragment
3,相关代码:

onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 判断 savedInstanceState是否为空:
    setCanResizeWindow(false);
    maskView = new View(getApplicationContext());
    maskView.setBackground(new ColorDrawable(Color.parseColor("#30000000")));
    maskView.setClickable(true);
    maskView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            removeMask();
        }
    });
    setContentView(R.layout.activity_home);

    EventBus.getDefault().register(this);

    //3,个推
    PushManager.getInstance().initialize(getApplicationContext());
    initView(savedInstanceState);
    getUserData();
    getDataFromMsgBrief();
}

    private void initView(Bundle savedInstanceState) {

        mBottomDial = (LinearLayout) findViewById(R.id.btn_Dial);
        mBottomComm = (LinearLayout) findViewById(R.id.btn_comm);
        mBottomContact = (LinearLayout) findViewById(R.id.btn_contact);
        mBottomLife = (LinearLayout) findViewById(R.id.btn_life);

        mBottomDialIv = (ImageView) findViewById(R.id.tab_dial_image);
        mBottomDiaTv = (TextView) findViewById(R.id.tab_dial_text);
        mSmsIV = (SmsImageView) findViewById(R.id.siv_sms_icon_homeact);
        //第一次登录系统时,修改数据库的Istravelrely字段
        if (!SpUtils.getSynDB(getApplicationContext())) {
            ThreadPoolUtil.getmExecutor().execute(new Runnable() {
                @Override
                public void run() {
                    CopyLocalContactsUtils.checkIsTravelRely(getApplication());
                    SpUtils.setSynDB(getApplicationContext());
                }
            });
        }

        //初始化mBottomDial为选中状态,fl_content填充DialFragment
        mBottomDial.setSelected(true);

//        if (savedInstanceState != null) {
//            LogUtils.d("HomeActivity savedInstanceState != null");
//
//            Fragment dialFragment = getSupportFragmentManager().findFragmentByTag(DIAL_TAG);
//            Fragment contactFragment = getSupportFragmentManager().findFragmentByTag(CONTACT_TAG);
//            Fragment commFragment = getSupportFragmentManager().findFragmentByTag(COMM_TAG);
//            Fragment lifeFragment = getSupportFragmentManager().findFragmentByTag(LIFE_TAG);
////            getSupportFragmentManager().beginTransaction()
//
//            getSupportFragmentManager().beginTransaction().hide(contactFragment)
//                    .hide(commFragment).hide(lifeFragment).show(dialFragment).commit();
//
//        } else {
            getSupportFragmentManager().beginTransaction().
                    add(R.id.fl_content, FragmentFactory.createFragment(0), "DialFragment").
                    add(R.id.fl_content, FragmentFactory.createFragment(1), "CommFragment").
                    add(R.id.fl_content, FragmentFactory.createFragment(2), "ContactFragment").
                    add(R.id.fl_content, FragmentFactory.createFragment(3), "LifeFragment").
                    hide(FragmentFactory.createFragment(1)).
                    hide(FragmentFactory.createFragment(2)).
                    hide(FragmentFactory.createFragment(3)).
                    show(FragmentFactory.createFragment(0)).commit();
//        }
        initClick();

    }

尝试过的解决办法:
1,为了解决多个fragment重叠显示,在activity的中执行了如下:

    @Override
    protected void onSaveInstanceState(Bundle outState) {
//        super.onSaveInstanceState(outState);
    }

问题现象:

ringa_leeringa_lee2812 days ago887

reply all(3)I'll reply

  • 迷茫

    迷茫2017-04-17 17:50:30

    @Override
        protected void onSaveInstanceState(Bundle outState) {
    //        super.onSaveInstanceState(outState);
        }

    This solution is wrong. It will cause the previous display content to be unable to be remembered after the activity is destroyed, thus making the interface blank.
    In order to solve the overlapping fragments, you can comment out super.onSaveInstanceState (outState), add the code to save the current fragment

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        outState.putString(SPConst.SHOW_TAG, showFragmentTag);
    }

    Then re-acquire the previous fragment when you come back, and then display it again

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        if (savedInstanceState != null) {
            showFragmentTag = savedInstanceState.getString(SPConst.SHOW_TAG);
            if (showFragmentTag != null) {
                showFragment = fragmentManager.findFragmentByTag(showFragmentTag);              
                switch (showFragmentTag) {
                    case fragmentTag1:
                        workFragment = showFragment;
                        break;
                    case fragmentTag2:
                        patientFragment = showFragment;
                        break;
                    case fragmentTag3:
                        synergyFragment = showFragment;
                        break;
                    case fragmentTag4:
                        toolFragment = showFragment;
                        break;
                    case fragmentTag5:
                        mineFragment = showFragment;
                        break;
                }
            }
        }
    }

    reply
    0
  • 大家讲道理

    大家讲道理2017-04-17 17:50:30

    The content is a bit messy. For your needs, it is recommended to use FragmentTabHost, so there will be no such messy problems.

    reply
    0
  • 天蓬老师

    天蓬老师2017-04-17 17:50:30

    Just use ViewPager directly

    reply
    0
  • Cancelreply