android顯示fragment
① 在Android開發中fragment有什麼優缺點
自從Android 3.0中引入fragments 的概念,根據詞海的翻譯可以譯為:碎片、片段。其目的是為了解決不同屏幕分辯率的動態和靈活UI設計。大屏幕如平板小屏幕如手機,平板電腦的設計使得其有更多的空間來放更多的UI組件,而多出來的空間存放UI使其會產生更多的交互,從而誕生了fragments 。
fragments 的設計不需要你來親自管理view hierarchy 的復雜變化,通過將Activity 的布局分散到frament 中,可以在運行時修改activity 的外觀,並且由activity 管理的back stack 中保存些變化。當一個片段指定了自身的布局時,它能和其他片段配置成不同的組合,在活動中為不同的屏幕尺寸修改布局配置(小屏幕可能每次顯示一個片段,而大屏幕則可以顯示兩個或更多)。
Fragment必須被寫成可重用的模塊。因為fragment有自己的layout,自己進行事件響應,擁有自己的生命周期和行為,所以你可以在多個activity中包含同一個Fragment的不同實例。這對於讓你的界面在不同的屏幕尺寸下都能給用戶完美的體驗尤其重要。
Fragment優點
Fragment可以使你能夠將activity分離成多個可重用的組件,每個都有它自己的生命周期和UI。
Fragment可以輕松得創建動態靈活的UI設計,可以適應於不同的屏幕尺寸。從手機到平板電腦。
Fragment是一個獨立的模塊,緊緊地與activity綁定在一起。可以運行中動態地移除、加入、交換等。
Fragment提供一個新的方式讓你在不同的安卓設備上統一你的UI。
Fragment 解決Activity間的切換不流暢,輕量切換。
Fragment 替代TabActivity做導航,性能更好。
Fragment 在4.2.版本中新增嵌套fragment使用方法,能夠生成更好的界面效果。
Fragment做局部內容更新更方便,原來為了到達這一點要把多個布局放到一個activity裡面,現在可以用多Fragment來代替,只有在需要的時候才載入Fragment,提高性能。
可以從startActivityForResult中接收到返回結果,但是View不能。
Fragment的生命周期
你可以把fragment看作是activity的模塊化組件,它擁有自己的生命周期
Fragment是activity的界面中的一部分或一種行為。你可以把多個Fragment們組合到一個activity中來創建一個多面界面並且你可以在多個activity中重用一個Fragment。你可以把Fragment認為模塊化的一段activity,它具有自己的生命周期,接收它自己的事件,並可以在activity運行時被添加或刪除。
Fragment不能獨立存在,它必須嵌入到activity中,而且Fragment的生命周期直接受所在的activity的影響。例如:當activity暫停時,它擁有的所有的Fragment們都暫停了,當activity銷毀時,它擁有的所有Fragment們都被銷毀。然而,當activity運行時(在onResume()之後,onPause()之前),你可以單獨地操作每個Fragment,比如添加或刪除它們。當你在執行上述針對Fragment的事務時,你可以將事務添加到一個棧中,這個棧被activity管理,棧中的每一條都是一個Fragment的一次事務。有了這個棧,就可以反向執行Fragment的事務,這樣就可以在Fragment級支持「返回」鍵(向後導航)。
顯示Fragment時(跟用戶交互)要調用的核心的生命周期方法如下:
1. 把Fragment對象跟Activity關聯時,調用onAttach(Activity)方法;
2. Fragment對象的初始創建時,調用onCreate(Bundle)方法;
3. onCreateView(LayoutInflater, ViewGroup, Bundle)方法用於創建和返回跟Fragment關聯的View對象;
4. onActivityCreate(Bundle)方法會告訴Fragment對象,它所依附的Activity對象已經完成了Activity.onCreate()方法的執行;
5. onStart()方法會讓Fragment對象顯示給用戶(在包含該Fragment對象的Activity被啟動後);
6. onResume()會讓Fragment對象跟用戶交互(在包含該Fragment對象的Activity被啟恢復後)。
Fragment對象不再使用時,要反向回調的方法:
1. 因為Fragment對象所依附的Activity對象被掛起,或者在Activity中正在執行一個修改Fragment對象的操作,而導致Fragment對象不再跟用戶交互時,系統會調用Fragment對象的onPause()方法;
2. 因為Fragment對象所依附的Activity對象被終止,或者再Activity中正在執行一個修改Fragment對象的操作,而導致Fragment對象不再顯示給用戶時,系統會調用Fragment對象的onStop()方法。
3. onDestroyView()方法用於清除跟Fragment中的View對象關聯的資源;
4. Fragment對象的狀態被最終清理完成之後,要調用onDestroy()方法;
5. 在Fragment對象不再跟它依附的Activity關聯的時候,onDetach()方法會立即被調用
② Android屏幕變化引起Fragment折疊的解決辦法
奇葩問題年年有,今天又碰到一個,最近呢,在項目開發維護中遇到這樣一個bug,vivo某某型號手機,三指頭同時下滑,瞅瞅效果圖,屏幕露出半個桌面來,而我們的應用布局發生重疊,不得不佩服我們的測試小姐姐,這樣奇葩問題,你都找得到,怎麼辦呢,網路谷歌唄!
這樣子,在當前頁面的Activity中的onCreate方法中輸出日誌,當頁面首次打開的時候有日誌輸出,當三個手指下滑的時候,又有日誌輸出,ok,到這里問題已經明朗,Activity重新創建了,顯然因為生命周期方法重復執行導致它承載的Fragment出現了布局折疊問題。
當手機屏幕變化笑銀培,比如橫豎屏切換,布局變化,屏幕尺寸改變等,在不經過設搏仿置時activity會被重新啟動創建,而且還不止一次,而要防止這碰唯個現象的發生,就需要配置configChanges這個屬性了。
找到了原因,那麼開始實施解決方案。
在AndroidManifest.xml中配置configChanges這個屬性如下
當配置完成後,再次發布程序到手機,日誌不在重復列印,頁面也能夠正常顯示。
這樣配置
android:configChanges="orientation"
那麼橫豎屏切換時就不會重新創建activity,那麼這個屬性到底是什麼意思呢?
首先,要了解Android默認在情況下,在系統的配置改變的情況下會重新創建activity,這個很好理解,因為系統環境變了,當然要重新創建activity來適應這個改變嘍。但是在很多時候我們不想在系統配置改變時重新載入activity,那麼就需要
android:configChanges=「xxx|xxx」這個樣子來搞定了。這里的xxx表這不同的系統配置的改變。
這里的xxx包含了很多種,就像我上邊寫的,可以用|來連接多個值。下面簡單介紹下各個值的不同含義:
喝飽水,閉上嘴,往前走,靠雙腿。
③ Android組件之Fragment(一)---基礎知識與運用
Fragment是Android3.0後引入的一個新的API,他出現的初衷是為了適應大屏幕的平板電腦, 當然現在他仍然是平板APP UI設計的寵兒,而且我們普通手機開發也會加入這個Fragment, 我們可以把他看成一個小型的Activity,又稱Activity片段!想想,如果一個很大的界面,我們 就一個布局,寫起界面來會有多麻煩,而且如果組件多的話是管理起來也很麻煩!而使用Fragment 我們可以把屏幕劃分成幾塊,然後進行分組,進行一個模塊化的管理!從而可以更加方便的在 運行過程中動態地更新Activity的用戶界面!另外Fragment並不能單獨使用,他需要嵌套在Activity 中使用,盡管他擁有自己的生命周期,但是還是會受到宿主Activity的生命周期的影響,比如Activity 被destory銷毀了,他也會跟著銷毀!
引用官方的一張圖片,其實已經說明問題了,就是為了更好的適配大屏,在大屏的時候,不需要去在一個activity內部通過復雜的布局和界面去實現,只需要去在一個activity內部,通過多個fragment來做界面布局實現即可,而且針對於多個fragment來說, 每個fragment有單獨的生命周期,
Demo樣例,我們在一個界面中,有上下兩個fragment,如圖所示:
Step 2: Fragment創建,視圖載入,數據賦值
BlankFragment .java
Step 3: Activity在onCreate( )方法中調用setContentView()之後調用FragmentTransaction 進行事務提交
FragmentTestActivity.java
在xml中聲明兩個fragment,指定為具體的fragment
Step 1:定義Fragment的布局,就是fragment顯示內容的
Step 2:自定義一個Fragment類,需要繼承Fragment或者他的子類,重寫onCreateView()方法 在該方法中調用:inflater.inflate()方法載入Fragment的布局文件,接著返回載入的view對象
BlankFragment.java
Step 3:在需要載入Fragment的Activity對應的布局文件中添加fragment的標簽, 記住,name屬性是全限定類名哦,就是要包含Fragment的包名,如:
Step 4: Activity在onCreate( )方法中調用setContentView()載入布局文件即可!
針對在一個Activity中的某個Layout中切換Fragment,,無非兩種方法:
我們自己看一下方法注釋
源碼方法注釋裡面說的很明白,這個方法會移除所有的fragment,然後添加當前的fragment。
這時分為兩種情況,一種是fragment已有並且在前台展示,一種是未有或者在後台,針對於前者,此時replace,生命周期不會發生變化,針對後者,生命周期會重新走
分為兩種情況,一種fragment已存在,一種未存在,針對於前者,生命周期無變化,但是會回調onHiddenChanged方法,針對於後者,生命周期會創建一次。
1.Fragment是Google官方引入的一個為了適配大屏、多頁面的一個組件。您可以理解為它就是一個類而已,只不過裡麵包含了View,並且與activity的生命周期進行了關聯。
2.動態載入與靜態載入相對來說,建議使用動態載入,靜態載入固定在了xml文件中,永遠不變。
3.replace的fragment如果不在前台,會執行所有生命周期,反之不會執行任何生命周期方法;hide+show生命周期並不會發生變化,但是會回調onHiddenChanged方法,在實際開發中,建議add之後,使用hide+show來操作fragment,一方面減少資源的重復載入和創建,另外一方面提升用戶體驗感。
4.fragment的生命周期大體上和activity一致,但是前期和後期多了一些東西,因為fragment內部有view,那麼這個view需要進行創建、然後添加到activity內部,所以相應的在onCreate與onStart之間就多了幾個方法-onCreateView、onViewCreated。相同的道理,fragment的view與activity解綁,也相應的在onStop與onDestory之間多個方法-onDestroyView。onAttach與onDetach可以理解為視圖與activity產生關聯和接觸關聯,是最開始和最後的步驟。
Demo地址
④ android怎麼在tabbed fragment 底部設置
自定義底部菜單欄實現方式
(1)對應的 Fragment 編輯代碼和布局實現在前面的 Fragment介紹和簡單實現 中已經有提及,代碼中沒復雜的地方,此處略過,具體可看實例代碼。
(2)菜單欄實現,這里使用代碼實現的,其實也可以用布局文件實現,代碼如下:
⑤ Android流行UI布局——底部導航(BottomNavigationView+ViewPager+Fragment)
Android端底部導航欄介紹
Android應用中底部導航欄的設計廣泛運用,如微信、微博、支付寶等。這一設計不僅借鑒了iOS的優點,也是為了提升用戶體驗。在Android開發中,底部導航欄有著特定的實現規范。
本文旨在提供如何使用官方BottomNavigationView、結合ViewPager和Fragment實現流行UI布局的詳細指南。同時,文中還將解決使用反射解決ViewPager與BottomNavigationView側滑聯動時的一個小問題。
最終實現效果展示如下:通過BottomNavigationView與ViewPager的結合,可以實現左右滑動切換,類似於微信的布局,或點擊切換,如支付寶的布局。
首先,新建項目並導入support:design庫,其中包含BottomNavigationView控制項。同時,導入V4包以支持ViewPager組件。
然後,在res目錄下創建menu文件夾並添加菜單。根據需要創建相應的菜單項。
接下來,進行布局文件的編寫。應用BottomNavigationView時,設置其屬性如`app:itemIconTint`和`app:itemTextColor`來實現icon和文字的顏色切換。
在activity文件中,實例化控制項並添加監聽事件。實現BottomNavigationView與ViewPager、Fragment的集成,完成流行布局。
在實現過程中,可能會遇到BottomNavigationView默認的放大的ShiftingMode效果與需要的側滑切換不匹配的問題。為了解決這一問題,引入了反射機制,通過反射操作BottomNavigationMenuView來控制切換行為。
通過實例化BottomNavigationView並調用特定代碼,可以自定義切換效果,避免默認的放大問題。若無需側滑切換,可直接使用默認效果。在處理禁止滑動情況時,通過為ViewPager添加`setOnTouchListener`介面並在`onTouch`方法中消費點擊事件來實現。
測試結果顯示,BottomNavigationView與ViewPager、Fragment的結合實現了流暢的左右滑動和點擊切換效果,為用戶提供更佳的用戶體驗。相關代碼實現和源碼可供參考,歡迎交流學習。