用Fragment制作的Tab頁面產生的UI重疊問題

本文出處:http://blog.csdn.net/twilight041132/article/details/43812745

?

在用Fragment做Tab頁面,發現有時候進入應用會同時顯示多個Tab內容,UI發生重疊。

當應用被強行關閉后(通過手機管家軟件手動強關,或系統為節省內存自動關閉應用),再次進入應用時,每次都有這現象。

第一次進入應用時,根據選擇的tab分別創建對應的Fragment,之后每次選擇頁面時隱藏其他tab內容。

通過分析發現,正常back鍵退出應用時,Activity及Fragment對象會被銷毀,因此再次進入時會在切換到Tab時創建對應的Fragment對象。

但是當強行關閉應用后,Activity雖然被回收,但Fragment對象仍然保持,再次進入應用時,系統會分別調用Fragment的onAttach方法將其附加到Activity上,

02-08 12:41:24.107: D/FragmentTab1(7032): onAttach

02-08 12:41:24.107: D/FragmentTab3(7032): onAttach

這里對應的就是強行關閉應用前的fragment對象,

后面會分別調用兩個fragment的onCreateView方法,因此這兩個Fragment對應的View層次結構都會加到Activity的View層次中。

雖然setSelection方法會把所有fragment先隱藏再顯示選中的對象,但由于此時Activity中Fragment對象的成員變量還未初始化,因此會再次實例化fragment對象,

之后add、show及hide的都是在第二次創建的對象上操作的,而之前被保持的fragment對象的視圖層次已經反映到Activity視圖中并且不會被hide,因此發生了上述重疊現象。

?

解決方法:

在Activity的onAttachFragment方法中,有一個fragment參數,它就是onAttach方法對應的Fragment對象,

通過判斷這個fragment對象,如果屬于我們的FragmentTabX類并且該類還未被實例化過,則將Activity的成員變量mFragmentTabX指向該fragment對象,這樣就可以在原來的fragment對象上操作add/show/hide,因此不會有重疊現象。

@Override  public void onAttachFragment(Fragment fragment) {  // TODO Auto-generated method stub  super.onAttachFragment(fragment);  Log.d(TAG,"onAttachFragment");  //mTab1,mTab2,mTab3 是在Activity中創建的Fragmentif (mTab1 == null && fragment instanceof FragmentTab1) {  mTab1 = (FragmentTab1)fragment;  }else if (mTab2 == null && fragment instanceof FragmentTab2) {  mTab2 = (FragmentTab2)fragment;  }else if (mTab3 == null && fragment instanceof FragmentTab3) {  mTab3 = (FragmentTab3)fragment;  }  }  

?

?

-------------------------------------華麗的分割線------------------------------------------

以下參考:http://m.blog.csdn.net/article/details?id=41912445

上面的貌似說的很有道理,但是測試了一下還是不行,也許是我遇到的問題跟他說的不一致。

我遇到的問題是:當報錯時(比如空指針)主頁面出現Fragment重疊。

在debug的時候,發現CarFragment是執行了onCreateView()的,意味著成功生成了車輛管理的界面,但究竟為什么仍然顯示的是SupplyFragment的界面呢,直觀感覺,SupplyFragment像一層蒙板一樣放在最上層,點擊其他4個tab欄,生成的Fragment都被隱藏在了它的下面。

后來在google查到相關資料,原因是:當Fragment長久不使用,系統進行回收,FragmentActivity調用onSaveInstanceState保存Fragment對象。很長時間后,再次打開app,系統恢復保存的Fragment,但是在FragmentActivity重新執行生命周期的時候,我們重新生成了fragment對象附加到該FragmentActivity,系統恢復的fragment和FragmentActivity失去關聯,進而出錯。

解決方案為以下兩種:

方法1:在fragmentActivity里oncreate方法判斷savedInstanceState==null才生成新Fragment,否則不做處理。

方法2:在fragmentActivity里重寫onSaveInstanceState方法,但不做實現,也就是將super.onSaveInstanceState(outState)注釋掉。

方法2很好理解,當系統要回收Fragment時,我們告訴系統:不要再保存Fragment。相當于用戶回到app的時候,我們就當用戶是第一次打開app(因為很長時間沒有操作了)。

方法1理論上沒有問題,但在測試的時候,用了一種非常規的方案,橫豎屏切換來測試,而在橫豎屏切換時,系統會首先銷毀FragmentActivity再重新生成,無法模擬測試條件,還要再研究。

方法1博主親測,沒有什么卵用。

轉載于:https://www.cnblogs.com/a446276468/p/5354206.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/374906.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374906.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374906.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

習題6-6 使用函數輸出一個整數的逆序數 (20 分)

本題要求實現一個求整數的逆序數的簡單函數。 函數接口定義: int reverse( int number );其中函數reverse須返回用戶傳入的整型number的逆序數。 我的代碼: int reverse( int number ) {int n number,res 0,t 0;n (n>0)?n:-n;while(n ! 0){t…

Tomcat 7上具有RESTeasy JAX-RS的RESTful Web服務-Eclipse和Maven項目

開發Web服務的RESTful方法不斷受到越來越多的關注,并且似乎正在將SOAP淘汰。 我不會討論哪種方法更好,但是我相信我們都同意REST更輕量級。 在本教程中,我將向您展示如何使用RESTeasy開發RESTful服務以及如何將它們部署在Tomcat服務器上。 在…

appcmd命令導入導出站點與應用程序池

在IIS7上導出所有應用程序池的方法: %windir%\system32\inetsrv\appcmd list apppool /config /xml > c:\apppools.xml 這個命令會將服務器上全部的應用程序池都導出來,但有些我們是我們不需要的,要將他們刪掉.比如: DefaultAppPoolClassic .Net AppPool如果在導入時發現同名…

卸載apache

1、運行services.msc,在服務中停止 apache 服務。2、運行命令行程序,輸入 sc delete apache,刪除該服務3、刪除apache文件夾。轉載于:https://www.cnblogs.com/jiangjieqim/p/5357950.html

使用wowza和xuggler將RTMP轉換為RTSP

注意:這是我們的“ Xuggler開發教程 ”系列的一部分。 大家好! 在過去的三個月中,我們一直在進行電話會議項目。 我們認為,使用諸如Flex之類的技術的基于Web的應用程序將是此類要求苛刻的項目的最佳方法。 隨著軟件的復雜性和電信…

如何設置網頁標題圖標

1、先制作一個名為favicon.ico的小圖標&#xff0c;并將其放到網站根目錄下 2、在html頁面<head></head>標簽內加入&#xff1a; <link rel"shortcut icon" href"favicon.ico" />OK轉載于:https://www.cnblogs.com/moshengr/p/4600281.h…

C語言pow函數的精度問題

&#xff08;1&#xff09;pow函數返回值是double類型 &#xff08;2&#xff09;pow原型 double pow(double x,double y); (3)sqrt原型 double sqrt(double x); 當輸出時函數值賦給整型就會出錯&#xff1a; int main()d {int N 1;scanf("%d",&N);for(int i …

習題2-1 求整數均值 (10 分)

吐槽一下&#xff0c;因為少打了一個空格&#xff0c;PTA上老是不給我過&#xff0c;還一直報結果錯誤&#xff0c;誤導我好久&#xff0c;即使是吹毛求疵&#xff0c;也應該提示我格式錯誤吧&#xff01;&#xff01; 原題&#xff1a; 本題要求編寫程序&#xff0c;計算4個整…

iframe高度自適應,終于解決了

一直被iframe的高度自適應的問題困擾著&#xff0c;在項目中也是多次遇到。網上也有不少相關的代碼&#xff0c;但是總不能滿足自己的要求。在頭痛了幾次之后終于下定決心解決這個問題。 本代碼主要解決的問題是&#xff1a;最外層滾動條隨著iframe高度動態變化的問題。如果ifr…

在領域驅動的設計,貧乏的領域模型,代碼生成,依賴項注入等方面……

埃里克埃文斯&#xff08;Eric Evans&#xff09;已制定了什么是域驅動設計&#xff08;DDD&#xff09;。 Martin Fowler是DDD的大力支持者和擁護者。 這些都是非凡的名字&#xff0c;幾乎可以肯定的是&#xff0c;他們正在支持一些有價值的東西。 我不是在這里對此爭論。 也許…

Javascript模塊化工具require.js教程

轉自&#xff1a;http://www.w3cschool.cc/w3cnote/requirejs-tutorial-1.html, http://www.w3cschool.cc/w3cnote/requirejs-tutorial-2.html 隨著網站功能逐漸豐富&#xff0c;網頁中的js也變得越來越復雜和臃腫&#xff0c;原有通過script標簽來導入一個個的js文件這種方式已…

數據值、列類型和數據字段屬性

數據值&#xff1a;數值型、字符型、日期型和空值等。數據列類型 2.1 數值類的數據列類型2.2 字符串類數據列類型 2.3 日期和時間型數據數據列類型 另外&#xff0c;也可以使用整形列類型存儲UNIX時間戳&#xff0c;代替日期和時間列類型&#xff0c;這是基于PHP的web項目中常…

全文搜索Apache Lucene簡介

在本教程中&#xff0c;我想談談Apache Lucene 。 Lucene是一個開源項目&#xff0c;提供基于Java的索引和搜索技術。 使用其API&#xff0c;很容易實現全文搜索 。 我將處理Lucene Java版本 &#xff0c;但請記住&#xff0c;還有一個名為Lucene.NET的.NET端口&#xff0c;以及…

函數scanf

本節介紹輸入函數 scanf 的用法。scanf 和 printf 一樣&#xff0c;非常重要&#xff0c;而且用得非常多&#xff0c;所以一定要掌握。 概述 scanf 的功能用一句話來概括就是“通過鍵盤給程序中的變量賦值”。該函數的原型為&#xff1a; # include <stdio.h> int scanf(…

C語言中定義變量位置

C標準的問題 C89規定&#xff0c;在任何執行語句之前&#xff0c;在塊的開頭聲明所有局部變量。 即應該如下&#xff1a;定義變量只能在最開始&#xff0c;scanf等執行語句之前 int N 0;double sum 0;scanf("%d",&N);在C99以及C中則沒有這個限制&#xff0c;即…

Java中的低GC:使用原語而不是包裝器

總覽 有兩個很好的理由在可能的地方使用原語而不是包裝器。 明晰。 通過使用原語&#xff0c;您可以清楚地知道null值是不合適的。 性能。 使用原語通常更快。 清晰度通常比性能更重要&#xff0c;并且是使用它們的最佳理由。 但是&#xff0c;本文討論了使用包裝程序對性能…

C# 連接Oracle數據庫以及一些簡單的操作

拖了很久今天終于在博客園寫了自己第一篇隨筆&#xff1a; 話不多說&#xff0c;我們直接進入正題&#xff1a; 1.連接數據庫 using (OracleConnection conn new OracleConnection("data source192.168.97.60/orcl;User Idabc;Passwordabc;")) { …

markdownb編輯器

這是H1 這是H2 這是H3 這是一個標題。 這是第一行列表項。這是第二行列表項。給出一些例子代碼&#xff1a; return shell_exec("echo $input | $markdown_script"); 轉載于:https://www.cnblogs.com/xcl461330197/p/4605163.html

Java Secret:使用枚舉構建狀態機

總覽 Java中的枚舉比許多其他語言更強大&#xff0c;這可能導致令人驚訝的用途。 在本文中&#xff0c;我概述了Java 枚舉的一些單獨功能&#xff0c;并將它們組合在一起形成一個狀態機。 單例和實用程序類的枚舉 您可以非常簡單地將枚舉用作Singleton或Utility。 enum Si…

數組部分筆記

對于數組的初始化需要注意以下幾點&#xff1a; 可以只給部分元素賦值。當{ }中值的個數少于元素個數時&#xff0c;只給前面部分元素賦值。例如&#xff1a; int a[10]{12, 19, 22 , 993, 344};表示只給 a[0]~a[4] 5個元素賦值&#xff0c;而后面 5 個元素自動初始化為 0。 …