日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

Android 关于Fragment重叠问题分析和解决

發(fā)布時間:2023/12/15 综合教程 45 生活家
生活随笔 收集整理的這篇文章主要介紹了 Android 关于Fragment重叠问题分析和解决 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、問題描述

相信大家在使用Fragment的過程中,肯定碰到過Fragment重疊的問題,重啟應(yīng)用就好了。然而原因是什么呢?

二、原因分析

首先,Android管理Fragment有兩種方式,使用add、hide、show的方式和replace方式,兩種方式各有優(yōu)缺點。

replace方式
如果使用這種方式,是可以避免重疊的問題,但是每次replace會把生命周期全部執(zhí)行一遍,如果在這些生命周期函數(shù) 里拉取數(shù)據(jù)的話,就會不斷重復(fù)的加載刷新數(shù)據(jù),所以我們并不推薦使用這種方式。

add、hide、show的方式
雖然這種方式避免了可能重復(fù)加載刷新數(shù)據(jù)的問題,但是會出現(xiàn)重疊的問題。

原因:

當系統(tǒng)內(nèi)存不足,F(xiàn)ragment 的宿主 Activity 回收的時候,F(xiàn)ragment 的實例并沒有隨之被回收。Activity 被系統(tǒng)回收時,會主動調(diào)用 onSaveInstance() 方法來保存視圖層(View Hierarchy),所以當 Activity 通過導(dǎo)航再次被重建時,之前被實例化過的 Fragment 依然會出現(xiàn)在 Activity 中,此時的 FragmentTransaction 中的相當于又再次 add 了 fragment 進去的,hide()和show()方法對之前保存的fragment已經(jīng)失效了,所以就出現(xiàn)了重疊。
然而我們還是推薦使用這個,我們可以解決。

三、問題重現(xiàn)

既然要解決問題,自然要重現(xiàn)一下!
1.手機的 “設(shè)置” - “開發(fā)者選項” - 打開”不保留活動”(主要用于模擬Activity被及時回收)
2.把 app 切換到后臺,再重新打開,通過點按不同的 tab 來切換 Fragment

四、解決方法

方法一、簡單暴力

通過注釋掉這句話,這樣主 Activity 因為種種原因被回收的時候就不會保存之前的 fragment state

@Override
protectedvoidonSaveInstanceState(Bundle outState) {
//如果用以下這種做法則不保存狀態(tài),再次進來的話會顯示默認tab
//總是執(zhí)行這句代碼來調(diào)用父類去保存視圖層的狀態(tài)
//super.onSaveInstanceState(outState);
}

方法二、(推薦使用)

重寫onAttachFragment,重新讓新的Fragment指向了原本未被銷毀的fragment,它就是onAttach方法對應(yīng)的Fragment對象

  @Override
    public void onAttachFragment(Fragment fragment) {
        if (tab1 == null && fragment instanceof Tab1Fragment)
            tab1 = fragment;
        if (tab2 == null && fragment instanceof Tab2Fragment)
            tab2 = fragment;
        if (tab3 == null && fragment instanceof Tab3Fragment)
            tab3 = fragment;
        if (tab4 == null && fragment instanceof Tab4Fragment)
            tab4 = fragment;
    }

方法三

思路同樣是阻止系統(tǒng)恢復(fù)Fragment state,在FragmentActivity保存所有Fragment狀態(tài)前把Fragment從FragmentManager中移除掉。

  protected void onSaveInstanceState(Bundle outState) {
        FragmentTransaction transaction = fm.beginTransaction();
        transaction.remove(tab1);
        transaction.remove(tab2);
        transaction.remove(tab3);
        transaction.remove(tab4);
        transaction.commitAllowingStateLoss();
        super.onSaveInstanceState(outState);
    }

成功解決,ok,o(∩_∩)o ,希望可以幫助有需要的同學(xué),如果覺得好,歡迎留個言啊!

五、源碼下載

源碼下載

總結(jié)

以上是生活随笔為你收集整理的Android 关于Fragment重叠问题分析和解决的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。