多个Fragment在屏幕翻转会重影问题的解决

fragment使用add和hide而不用replace的方法添加到activity中,如果屏幕翻转可能会又add新的fragment进去,所以会重影。

如果有一个sparsearray保存fragment,那么在初始化的时候就应该用

    private void initFragment(Bundle savedInstanceState) {
        //set up fragments
//        fragments.append(MAIN_INDEX, MainFragment.newInstance());
//        fragments.append(SUCCESS_INDEX, SuccessFragment.newInstance());
//        fragments.append(FAILED_INDEX, FailedFragment.newInstance());
//        fragments.append(NONE_INDEX, NoneFragment.newInstance());
        fragments = new SparseArray<>();
        //Main Fragment
        Fragment mainFragment = getSupportFragmentManager().findFragmentByTag(String.valueOf(MAIN_INDEX));
        if (mainFragment == null) {
            mainFragment = MainFragment.newInstance();
        }
        fragments.append(MAIN_INDEX, mainFragment);
        //Success Fragment
        Fragment succcessFragment = getSupportFragmentManager().findFragmentByTag(String.valueOf(SUCCESS_INDEX));
        if (succcessFragment == null) {
            succcessFragment = SuccessFragment.newInstance();
        }
        fragments.append(SUCCESS_INDEX, succcessFragment);
        //Failed Fragment
        Fragment failedFragment = getSupportFragmentManager().findFragmentByTag(String.valueOf(FAILED_INDEX));
        if (failedFragment == null) {
            failedFragment = FailedFragment.newInstance();
        }
        fragments.append(FAILED_INDEX, failedFragment);
        //none Fragment
        Fragment noneFragment = getSupportFragmentManager().findFragmentByTag(String.valueOf(NONE_INDEX));
        if (noneFragment == null) {
            noneFragment = NoneFragment.newInstance();
        }
        fragments.append(NONE_INDEX, noneFragment);
        //add to activity
        for (int i = 0; i < fragments.size(); i++) {
            Fragment f = fragments.valueAt(i);
            if (!f.isAdded())
                getSupportFragmentManager()
                        .beginTransaction()
                        .add(R.id.container, f, String.valueOf(fragments.keyAt(i)))
                        .hide(f)
                        .commit();
        }
    }

不直接append新的fragment,而是通过fragmentsupportmanager先检查有没有已有的fragment,这样就可以解决重影问题。

需要注意的是:setRetainInstance(true)必须设置,这样fragment才不会在manager中销毁,替换fragment后想修改数据才不会出现nullpointerexception错误

时间: 2024-10-18 05:45:07

多个Fragment在屏幕翻转会重影问题的解决的相关文章

JavaScript获取手机屏幕翻转方法

/*屏幕翻转*/ window.addEventListener(window['onorientationchange'] ? 'orientationchange' : 'resize', function(){ //do someing... }, false);

Android测试的坑——屏幕翻转

背景 最近在看Android开发,发现有一些坑是没有了解过Android开发是无法发现的,简单的记录一下. 场景 用Android开发一个回答问题的APP,大概有5个问题,回答完毕后切换到下一题,或者手工跳到下一题.整个APP功能很简单,但是依然有很多的坑. 翻转屏幕后问题被重置为第一题 这个问题是一个很有意思的问题,在竖屏的时候查看第四题,但是在横屏之后,问题被重置为第一题了. 要了解这个问题,就必须了解Android中Activity的声明周期.Android中Activity有如下的生命周

解决手机访问网站时整体相对屏幕缩小问题?(已解决)

自己开发出来的网站,在手机上访问时,总是整体小了一块,不能很好的适应屏幕,每次都要用手指再放大到合适尺寸,后发现,需要在开发代码中添加: <meta name="viewport" content="width=device-width, initial-scale=1">  (可添加到第一行) 参数说明: width - viewport的宽度 height - viewport的高度 initial-scale - 初始的缩放比例 minimum-s

解决手机訪问站点时总体相对屏幕缩小问题?(已解决)

自己开发出来的站点,在手机上訪问时,总是总体小了一块.不能非常好的适应屏幕,每次都要用手指再放大到合适尺寸,后发现,须要在开发代码中加入: <meta name="viewport" content="width=device-width, initial-scale=1">  (可加入到第一行) 參数说明: width - viewport的宽度 height - viewport的高度 initial-scale - 初始的缩放比例 minimum-

Android开发系列(一)Activity与Fragment获取屏幕获取屏幕像素的不同方式

Activity中常用的获取屏幕像素代码: //获取屏幕像素相关信息 DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); 在开发时,我使用的fragment继承自android.support.v4.app.Fragment,getWindowManager()这个 方法在fragment中并没有该方法, 因为只有继承自Activity才包含该方法,那么在

cocos2d-x 2.x 支持多个方向屏幕翻转

主要改动 RootViewController.mm 的 supportedInterfaceOrientations 方法 1.四个方向 UIInterfaceOrientationMaskAll 2.三个方向(除了屏幕倒着全部都能够旋转) UIInterfaceOrientationMaskAllButUpsideDown 3.竖屏两个方向 UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsid

js监视移动设备屏幕翻转事件

在window上面绑定onorientationchange事件即可监控屏幕角度变化,根据需要进行动态加载css样式或者刷新页面等操作. 1 window.onorientationchange = function(){ 2 window.location.reload(true); //刷新操作 3 switch(window.orientation){ 4 case -90: 5 case 90: 6 alert("横屏:" + window.orientation); 7 br

android屏幕翻转不重新加载android:configChanges=&quot;orientation|keyboardHidden&quot;

如果一个activity在横屏状态下切换到竖屏状态,是不是会把整个activity重新加载一遍呢?这样的话,所有变量和方法都被初始化了,显然,一般我们不想这样. AndroidManifest.xml android:configChanges="keyboardHidden|orientation" 就是如果配置了这个属性,当我们横竖屏切换的时候会直接调用onCreate方法中的onConfigurationChanged方法,而不会重新执行onCreate方法,那当然如果不配置这个

Checkbox Text 重影问题的解决的方法

Checkbox有个属性值 <CheckBox android:id="@+id/cb_reg_agree" style="@style/reg_checkbox_style" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/Btn" android: