導航:首頁 > 操作系統 > androidfragment管理

androidfragment管理

發布時間:2022-12-11 14:05:55

A. android的Fragment知識點

frgment被創建的時候,相關的生命周期,
onAttach(), onCreate(), onCreateView(), onActivityCreated();
fragment對用戶可見的時候,相關的生命周期,
onStrat(), onResume(),
fragment進入「後台模式」的時候,相關的生命周期,
onPause(), onStop(),
fragment被銷毀的時候,相關的生命周期,
onPause(), onStop(), onDestroyView(), onDestroy(), onDetach()
可用onCreate()、onCreateView()、onActivityCreated()方法Bundle對象保存一個fragment的對象

onAttach():Fragment和Activity相關聯時調用,可以通過該方法獲取Activity引用,還可以通過getArguments()獲取參數。
onCreate():Fragment創建時被調用。
onCreateView():創建Fragment的布局。
onActivityCreated():當Activity完成onCreate時調用。
onStart():當Fragment可見時。
onResume():當Fragment可見,且可交互時調用。
onPause():當Fragment不可交互,但可見時。
onStop():當Fragment不可見時。
onDestroyView():當Fragment的UI從視圖結構中移除時調用。
onDestroy():銷毀Fragment時
onDetach():當Fragment和Activity解除關聯時調用。

B. Android-ViewModel原理解析

在這四個方法中,其實唯一的區別就是要不要傳Factory,當沒有傳自定義的Factory的時候,則會傳入默認的Factory,我們看ViewModelProvider構造器的源碼和部分of方法的源碼:

在ViewModelProvider中需要傳入一個VieModelStore對象,這個對象是由ViewModelStoreOwner來提供的,而在Activity或者Fragment中,是由Activity和Fragment來提供的,因為ViewModelStoreOwner是一個介面,而AppCompatActivity的祖父ComponentActivity和Fragment均實現了ViewModelStoreOwner介面。

但是ViewModelProviders在新的lifecycle-extensions庫中,已經是屬於被棄用的。新版的API直接使用ViewModelProvider,而不是ViewModelProviders。
比如:

可以如下的方式在baseActivity中添加,由子類Activity調用:

創建ViewModel對象,首先就需要先初始化一個ViewModelProvider對象

可以看出,ViewModelProvider構造函數其實最終都是需要兩個參數,一個是ViewModelStoreOwner對象,一個是Factory。而ViewModelStoreOwner其實就是用來獲取一個ViewModelStore對象來保存ViewModel對象的。而Factory就是用來創建ViewModel對象的。

這個介面的主要實現的作用就是返回一個ViewModelStore對象。在Android中,Activity和Fragment都會實現該介面,並且實現getViewModelStore()方法。
比如Activity就是在FragmentActivity的父類ComponentActivity中實現了ViewModelStoreOwner介面

Fragment的ViewModelStore其實是由FragmentManager進行管理獲取

每個FragmentActivity都會有一個自己的FragmentManager對象,所以每個FragmentManagerViewModel對象,管理的是一個FragmentActivity中的所有的Fragment對應的ViewModel。具體看FragmentManagerViewModel的getViewModelStore方法

從這里可以看出,每個Fragment都會有自己的ViewModelStore對象,而ViewModelStore對象,是根據每個Fragment的唯一標識進行創建的。

ViewModelStore類對象,是每個Activity或者Fragment都有一個,目的是用於保存該頁面的ViewModel對象,方便ViewModel的管理

從ViewModelProvider的get方法中,可以看出,get方法傳入的是一個ViewModel.class的Class類型,然後通過這個類型,得到ViewModel的規范名稱。將ViewModel對象緩存在ViewModelStore中的HashMap中。而ViewModel的創建,其實是通過ViewModelProvider.Factory來實現的

ViewModelProviders的of方法,用於返回一個ViewModelProvider對象

從這里我們可以看到,如果傳入的Activity或者Fragment有方法實現,而factory為null的時候,則會通過創建對應的Factory,而如果沒有的實現,那麼就會調用NewInstanceFactory來創建對應的Factory,而NewInstanceFactory其實就是創建AndroidViewModelFactory對象。
最終ViewModel對象,其實就是通過AndroidViewModelFactory的create的方法實現來創建。一般就是通過Class.newInstance或者Class.getConstructor來創建對象。

而ViewModelProvider的第一個參數,其實最終傳入的是ViewModelStore對象,這個對象內部是通過一個HashMap來保存ViewModel對象
而新版的源碼,ViewModelStore對象是通過Fragment和FragmentActivity對象的getViewModelStore方法來獲取,而原先的HolderFragment的功能都移植到了Fragment中

HolderFragment通過設置setRetainInstance(true),使得自身能夠不受到屏幕旋轉等configuration
changes影響而存活,直到依附的Activity正常結束。
因為HolderFragment的生命周期,ViewModelStore對象保存在HolderFragment中,而ViewModel又存儲在ViewModelStore中,這就是為什麼我們說ViewModel類能夠讓數據在屏幕旋轉等配置信息改變導致UI重建的情況下不被銷毀。

ViewModelProvider的get方法:

在ViewModel中,有兩種Factory,Factory是的類型是由ViewModelProvider在初始化的時候創建的,所以是由ViewModelProvider決定Factory的類型。在ViewModelProvider中,有兩種Factory,一種是默認的Factory,默認的Factory是通過在ComponentActivity或者Fragment中實現介面,然後在()方法中初始化一個SavedStateViewModelFactory對象;另一種Factory則是NewInstanceFactory,這種是通過NewInstanceFactory.getInstance()的單例方式獲取。

其實就是通過ViewModel的Class對象,然後通過反射創建ViewModel對象,然後保存到ViewModelStore中的Map集合中
從ViewModelProvider的get方法可以看出,在ViewModelProvider的get方法中會根據Factory的類型,進行不同方法的調用。SavedStateViewModelFactory是實現了ViewModelProvider.KeyedFactory介面的,所以在創建ViewModel的時候,調用的是SavedStateViewModelFactory的create方法。

AndroidViewModel和ViewModel的構造器參數Class

ViewModel保存和恢復數據
ComponentActivity和Fragment都將數據的保存和恢復邏輯轉發給了SavedStateRegistryController。在在onCreate方法里通過調用performRestore來恢復數據,在onSaveInstanceState方法里通過調用performSave來保存數據。而SavedStateRegistryController中的SavedStateRegistry對象,就是實際進行數據的保存和恢復的,在SavedStateRegistry通過唯一的key獲取到一個SavedStateProvider,而SavedStateProvider其實就是返回需要保存的數據,將對應的需要緩存的數據一一返回,然後保存在系統緩存時的回調到onSaveInstanceState的方法參數Bundle中進行保存。
SavedStateRegistry.performSave()
該方法是由ComponentActivity的onSaveInstanceState方法觸發調用SavedStateRegistryController的performSave,進而調用的

在SavedStateRegistry恢復數據的時候,會把恢復後的數據都交給SavedStateHandle。希望保留的數據,可以通過兩種方式向mRegular保存數據。

在ComponentActivity恢復數據的時候,會通過SavedStateRegistryController.performSave在Activity的onSaveInstanceState方法中進行數據的保存,然後在ComponentActivity的onCreate方法中,通過調用SavedStateRegistryController.performRestore方法進行數據的恢復,這些恢復的數據都會保存在SavedStateHandleController對象中的SavedStateHandle屬性中,然後在Activity重新創建的時候,會通過反射創建對應的ViewModel對象的時候,將SavedStateHandleController中的SavedStateHandle賦值給對應的ViewModel進行數據恢復。

這塊的源碼分析可以參考:
從源碼看 Jetpack(7)-SavedStateHandle源碼詳解

這里其實就是直接使用Class的newInstance直接創建對象。Activity和Fragment一般都是使用SavedStateViewModelFactory創建ViewModel對象。

ViewModel的銷毀,要分為Activity和Fragment兩部分。
首先看下ViewModel在銷毀的時候做的事情

而ViewModel的clear()方法的調用,是在ViewModelStore中

Activity的銷毀,是通過Lifecycle監聽生命周期回調,當生命周期執行到onDestroy的時候,調用ViewModelStore的clear()方法進行ViewModel的銷毀。
看ComponentActivity中構造器中的實現:

Fragment的生命周期管理,如下:

Fragment的生命周期,首先會依次增大,然後在從onResume變成onPause的時候,就開始狀態碼減小。即先升再降的一個狀態變化。在當前狀態碼變成CREATED的時候,就會執行onDestroy。即調用

FragmentStateManager.destroy

在這里就會調用nonConfig.clearNonConfigState方法,nonConfig其實就是FragmentManagerViewModel對象。
FragmentManagerViewModel.clearNonConfigState

按照上面的邏輯,在Activity重建時會執行destory生命周期事件,那麼為什麼ViewModel沒有銷毀呢?
其實就是在屏幕旋轉的時候,AMS通過Binder回調Activity的()方法,這個時候就會進行數據的保存,保存到一個NonConfigurationInstances對象;而在屏幕翻轉結束之後,會再一次調用ViewModelProvider的構造函數,此時就會調用owner.getViewModelStore(),接著就會調用(),這里就會通過Activity中的NonConfigurationInstances對象取出保存的ViewModelStore對象。
所以數據保存就是通過()方法保存在NonConfigurationInstances對象,而再一次使用取出ViewModel的數據的時候,就是從nc對象中取出ViewModelStore對象,而ViewModelStore對象保存有ViewModel集合
通過對ComponentActivity的getViewModelStore()方法進行分析。可以找到這個問題的答案。

當mViewModelStore為null的時候,會從NonConfigurationInstances中獲取ViewModelStore對象。
其實在ComponentActivity和Activity中都會有一個NonConfigurationInstances類,而Activity中的NonConfigurationInstances類結構如下:

這里的Object activity其實就是保存的ComponentActivity中的NonConfigurationInstances類對象,看Activity的下面的方法:

activity這個Object對象,其實是通過()方法返回值賦值,而()方法的實現是在ComponentActivity中。
看ComponentActivity中的下面方法:

因為這里會在ComponentActivity中的NonConfigurationInstances類對象中保存ViewModelStore對象,所以這也是Activity重建時不會銷毀ViewModel的原因。

()方法除了被Activity的()調用以外,還會被LocalActivityManager的()方法調用

在分析ViewModel的銷毀過程時,我們看到Activity與Fragment存儲VieModel是分離的,那麼同一個Activity下的Fragment是如何共享ViewModel的呢?
其實共享的是Activity的ViewModel。

而具體的實現邏輯,其實就是在FragmentViewModelLazy.kt中的:

在Fragment中可以直接調用,這是一個Fragment的擴展函數,通過實現requireActivity().viewModelStore,獲取到了Activity的ViewModelStore對象後,這樣就可以實現了Fragment共用Activity的ViewModel,從而實現了Fragment之間共享ViewModel。
Fragment之間共享ViewModel,需要引入

C. Android中打開其他應用(或者系統應用)Activity或者Fragment總結

最近在做項目適配工作,需要打開手機中設置頁面進行設置。國內 rom 都是自己改過的,適配起來也是稍微的麻煩。同一個功能不同的手機品牌界面都不一樣,純粹的用 adb 命令以及 logcat 來查看每個手機對應的頁面的 Activity 或者 Fragment 以及包名。簡單的記錄一下過程。

在控制台中輸入一下命令,可以查看當前頁面顯示Activity的全部信息

拿小米手機 (Android 6.0, MIUI 9.2 )的鎖屏和密碼這個功能頁面來說。在控制台輸入命令之後,可以看到一長串的信息。

可以看到當前的 Activity 的包名 com.android.settings 以及 Activity 的名稱 SubSettings 。這樣不久可以通過隱士調用打開頁面了么? 直接上手操作一波。

結果很尷尬的,打開的是空白頁,這又是怎麼回事?而且跳轉了幾個頁面在同時輸入上邊命令,也是顯示這個頁面 SubSettings 。這樣就開始疑惑了,想到這應該是小米在上邊改動,通過Fragment來實現相關的功能了。先看看原生的系統源碼。(網上源碼地址: http://androidxref.com/ )。打開源碼,發現沒有實現什麼具體的東西。

但是看到源碼中 protected boolean isValidFragment(String fragmentName) 確定了這其實就是一個 Fragment 的容器。好那再接著看 mpsys 命令的返回信息。

看到 Activie Fargment MiuiSecuritySettings 。 但是又不知道包名,因為手機廠商各種改,不一定包名就是 settings 。就有通過 Android Studio Logcat 找到了解決方案。鏈接手機的時候 Logcat 列印了各種系統的 log 。 Ctrl + F 直接搜索一下 MiuiSecuritySettings 。果然找到了

最後,通過如下的方法,啟動小米系統的鎖屏和密碼設置界面

其他的頁面,應該也是大同小異的處理思路,只能一個個手機來實際適配了,並沒有找到一個很好的解決辦法,挨。

D. Android——Fragment

Fragment必須總是被嵌入到一個activity之中,並且fragment的生命周期直接接受其宿主activity的生命周期的影響。你可以認為fragment是activity的一個模塊零件,它有自己的生命周期,接收它自己的輸入的事件,並且可以在activity運行時添加或者刪除。

應該將每一個fragment設計為模塊化和可復用化的activity組件。也就是說,你可以在多個activity中引用同一個fragment,因為fragment定義了它自己的布局,並且使用它本身生命周期回調的行為。

Fragment比Activity多了幾個額外的生命周期回調方法:

管理fragment生命周期與管理activity生命周期很相像,像activity一樣,fragment也有三種狀態:
1、Resumed:
fragment在運行中的activity中可見。

2、Paused:
另一個activity處於前台且得到焦點,但是這個fragment所在的activtiy仍然可見(前台activity部分透明,或者沒有覆蓋全屏)。

3、Stopped:
fragment不可見。要麼宿主activity已經停止,要麼fragment已經從activity上移除,但已被添加到後台棧中。一個停止的fragment仍然活著(所有的狀態和成員信息仍然由系統保留著)。但是,它對於用戶來講已經不再可見,並且如果activity被殺掉,它也將被殺掉。

如果activity的進程被殺掉了,在activity被重新創建時,你恢復fragment狀態。可以執行fragment的onSaveIntanceState()來保存狀態(注意:fragment是在onCreate(),onCreateView()或者onActivityCreate()中進行恢復)。

在生命周期方面,activity和fragment之間一個很重要的不同就是在各自的後台棧中是如何存儲的。當activity停止時,默認情況下activity被安置在由系統管理的activity後台棧中;fragment僅當在一個事務被移除時,通過顯式調用addToBackStack()請求保存的實例,該fragment才被置於由宿主activity管理的後台棧。

類似與Android系統為Activity維護一個任務棧,我們也可以通過Activity維護一個回退棧來保存每次Fragment事務發生的變化。

如果你將Fragment任務添加到回退棧,當用戶點擊後退按鈕時,將看到上一次的保存的Fragment。一旦Fragment完全從後退棧中彈出,用戶再次點擊後退鍵,則退出當前Activity。

通過Arguments創建Fragment,不建議通過為Fragment添加帶參數的構造函數

1、FragmentPagerAdapter:對於不再需要的fragment,選擇調用detach方法,僅銷毀視圖,並不會銷毀fragment實例。

2、FragmentStatePagerAdapter:會銷毀不再需要的fragment,當當前事務提交以後,會徹底的將fragment從當前Activity的FragmentManager中移除。

3、懶載入,核心方法是 setUserVisibleHint()

原因1:橫豎屏切換,造成Fragment重新實例化。
原因2:按下Home鍵,Activity處於後台,由於內存不足被銷毀,重新喚醒時Fragment重新實例化。

註:出現的原因是在 API24 之前的 v4包 的源碼問題,
解決方案:通過檢查onCreate的參數Bundle savedInstanceState就可以判斷,當前是否發生Activity的重新創建:

默認的savedInstanceState會存儲一些數據,只有在savedInstanceState==null時,才進行創建Fragment實例:

E. Android 多返回棧技術詳解

用戶通過系統返回按鈕導航回去的一組頁面,在開發中被稱為返回棧 (back stack)。多返回棧即一堆 "返回棧",對多返回棧的支持是在 Navigation 2.4.0-alpha01 和 Fragment 1.4.0-alpha01 中開始的。本文將為您展開多返回棧的技術詳解。

無論您在使用 Android 全新的 手勢導航 還是傳統的導航欄,用戶的 "返回" 操作是 Android 用戶體驗中關鍵的一環,把握好返回功能的設計可以使應用更加貼近整個生態系統。

在最簡單的應用場景中,系統返回按鈕僅僅 finish 您的 Activity。在過去您可能需要覆寫 Activity 的 onBackPressed() 方法來自定義返回操作,而在 2021 年您無需再這樣操作。我們已經在 OnBackPressedDispatcher 中提供了 針對自定義返回導航的 API。實際上這與 FragmentManager 和 NavController 中 已經 添加的 API 相同。

這意味著當您使用 Fragments 或 Navigation 時,它們會通過 OnBackPressedDispatcher 來確保您調用了它們返回棧的 API,系統的返回按鈕會將您推入返回棧的頁面逐層返回。

多返回棧不會改變這個基本邏輯。系統的返回按鈕仍然是一個單向指令 —— "返回"。這對多返回棧 API 的實現機制有深遠影響。

在 surface 層級,對於 多返回棧的支持 貌似很直接,但其實需要額外解釋一下 "Fragment 返回棧" 到底是什麼。FragmentManager 的返回棧其實包含的不是 Fragment,而是由 Fragment 事務組成的。更准確地說,是由那些調用了 addToBackStack(String name) API 的事務組成的。

這就意味著當您調用 commit() 提交了一個調用過 addToBackStack() 方法的 Fragment 事務時, FragmentManager 會執行所有您在事務中所指定的操作 (比如 替換操作 ),從而將每個 Fragment 轉換為預期的狀態。然後 FragmentManager 會將該事務作為它返回棧的一部分。

當您調用 popBackStack() 方法時 (無論是直接調用,還是通過系統返回鍵以 FragmentManager 內部機制調用),Fragment 返回棧的最上層事務會從棧中彈出 -- 比如新添加的 Fragment 會被移除,隱藏的 Fragment 會顯示。這會使得 FragmentManager 恢復到最初提交 Fragment 事務之前的狀態。

也就是說 popBackStack() 變成了銷毀操作: 任何已添加的 Fragment 在事務被彈出的時候都會丟失它的狀態。換言之,您會失去視圖的狀態,任何所保存的實例狀態 (Saved Instance State),並且任何綁定到該 Fragment 的 ViewModel 實例都會被清除。這也是該 API 和新的 saveBackStack() 方法之間的主要區別。 saveBackStack() 可以實現彈出事務所實現的返回效果,此外它還可以確保視圖狀態、已保存的實例狀態,以及 ViewModel 實例能夠在銷毀時被保存。這使得 restoreBackStack() API 後續可以通過已保存的狀態重建這些事務和它們的 Fragment,並且高效 "重現" 已保存的全部細節。太神奇了!

而實現這個目的必須要解決大量技術上的問題。

雖然 Fragment 總是會保存 Fragment 的視圖狀態,但是 Fragment 的 onSaveInstanceState() 方法只有在 Activity 的 onSaveInstanceState() 被調用時才會被調用。為了能夠保證調用 saveBackStack() 時 SavedInstanceState 會被保存,我們 需要在 Fragment 生命周期切換 的正確時機注入對 onSaveInstanceState() 的調用。我們不能調用得太早 (您的 Fragment 不應該在 STARTED 狀態下保存狀態),也不能調用得太晚 (您需要在 Fragment 被銷毀之前保存狀態)。

這樣的前提條件就開啟了需要 解決 FragmentManager 轉換到對應狀態的問題,以此來保障有一個地方能夠將 Fragment 轉換為所需狀態,並且處理可重入行為和 Fragment 內部的狀態轉換。

在 Fragment 的重構工作進行了 6 個月,進行了 35 次修改時,發現 Postponed Fragment 功能已經嚴重損壞,這一問題使得被推遲的事務處於一個中間狀態 —— 既沒有被提交也並不是未被提交。之後的 65 個修改和 5 個月的時間里,我們幾乎重寫了 FragmentManager 管理狀態、延遲狀態切換和動畫的內部代碼,具體請參見我們之前的文章《全新的 Fragment: 使用新的狀態管理器》。

隨著技術問題的逐步解決,包括更加可靠和更易理解的 FragmentManager ,我們新增加了兩個 API: saveBackStack() 和 restoreBackStack() 。

如果您不使用這些新增 API,則一切照舊: 單個 FragmentManager 返回棧和之前的功能相同。現有的 addToBackStack() 保持不變 —— 您可以將 name 賦值為 null 或者任意 name 。然而,當您使用多返回棧時, name 的作用就非常重要了: 在您調用 saveBackStack() 和之後的 restoreBackStack() 方法時,它將作為 Fragment 事務的唯一的 key。

舉個例子,會更容易理解。比如您已經添加了一個初始的 Fragment 到 Activity,然後提交了兩個事務,每個事務中包含一個單獨的 replace 操作:

也就是說我們的 FragmentManager 會變成這樣:

比如說我們希望將 profile 頁換出返回棧,然後切換到通知 Fragment。這就需要調用 saveBackStack() 並且緊跟一個新的事務:

現在我們添加 ProfileFragment 的事務和添加 EditProfileFragment 的事務都保存在 "profile" 關鍵字下。這些 Fragment 已經完全將狀態保存,並且 FragmentManager 會隨同事務狀態一起保持它們的狀態。很重要的一點: 這些 Fragment 的實例並不在內存中或者在 FragmentManager 中 —— 存在的僅僅只有狀態 (以及任何以 ViewModel 實例形式存在的非配置狀態)。

替換回來非常簡單: 我們可以在 "notifications" 事務中同樣調用 saveBackStack() 操作,然後調用 restoreBackStack() :

這兩個堆棧項高效地交換了位置:

維持一個單獨且活躍的返回棧並且將事務在其中交換,這保證了當返回按鈕被點擊時, FragmentManager 和系統的其他部分可以保持一致的響應。實際上,整個邏輯並未改變,同之前一樣,仍然彈出 Fragment 返回棧的最後一個事務。

這些 API 都特意按照最小化設計,盡管它們會產生潛在的影響。這使得開發者可以基於這些介面設計自己的結構,而無需通過任何非常規的方式保存 Fragment 的視圖狀態、已保存的實例狀態、非配置的狀態。

當然了,如果您不希望在這些 API 之上構建您的框架,那麼可以使用我們所提供的框架進行開發。

Navigation Component 最初 是作為通用運行時組件進行開發的,其中不涉及 View、Fragment、Composable 或者其他屏幕顯示相關類型及您可能會在 Activity 中實現的 "目的地界面"。然而,NavHost 介面 的實現中需要考慮這些內容,通過它添加一個或者多個 Navigator 實例時,這些實例 確實 清楚如何與特定類型的目的地進行交互。

這也就意味著與 Fragment 的交互邏輯全部封裝在了 navigation-fragment 開發庫和它其中的 FragmentNavigator 與 DialogFragmentNavigator 中。類似的,與 Composable 的交互邏輯被封裝在完全獨立的 navigation-compose 開發庫和它的 ComposeNavigator 中。這里的抽象設計意味著如果您希望僅僅通過 Composable 構建您的應用,那麼當您使用 Navigation Compose 時無需任何涉及到 Fragment 的依賴。

該級別的分離意味著 Navigation 中有兩個層次來實現多返回棧:

仍需特別注意那些 尚未 更新的 Navigator ,它們無法支持保存自身狀態。底層的 Navigator API 已經整體重寫來支持狀態保存 (您需要覆寫新增的 navigate() 和 popBackStack() API 的重載方法,而不是覆寫之前的版本),即使 Navigator 並未更新, NavController 仍會保存 NavBackStackEntry 的狀態 (在 Jetpack 世界中向後兼容是非常重要的)。

如果您僅僅在應用中使用 Navigation,那麼 Navigator 這個層面更多的是實現細節,而不是您需要直接與之交互的內容。可以這么說,我們已經完成了將 FragmentNavigator 和 ComposeNavigator 遷移到新的 Navigator API 的工作,使其能夠正確地保存和恢復它們的狀態,在這個層面上您無需再做任何額外工作。

如果您正在使用 NavigationUI,它是用於連接您的 NavController 到 Material 視圖組件的一系列專用助手,您會發現對於菜單項、 BottomNavigationView (現在叫 NavigationRailView ) 和 NavigationView ,多返回棧是 默認啟用 的。這就意味著結合 navigation-fragment 和 navigation-ui 使用就可以。

NavigationUI API 是基於 Navigation 的其他公共 API 構建的,確保您可以准確地為自定義組件構建您自己的版本。保證您可以構建所需的自定義組件。啟用保存和恢復返回棧的 API 也不例外,在 Navigation XML 中通過 NavOptions 上的新 API,也就是 navOptions Kotlin DSL,以及 popBackStack() 的重載方法可以幫助您指定 pop 操作保存狀態或者指定 navigate 操作來恢復之前已保存的狀態。

比如,在 Compose 中,任何全局的導航模式 (無論是底部導航欄、導航邊欄、抽屜式導航欄或者任何您能想到的形式) 都可以使用我們在與 底部導航欄集成 所介紹的相同的技術,並且結合 saveState 和 restoreState 屬性一起調用 navigate() :

對用戶來說,最令人沮喪的事情之一便是丟失之前的狀態。這也是為什麼 Fragment 用一整頁來講解 保存與 Fragment 相關的狀態,而且也是我非常樂於更新每個層級來支持多返回棧的原因之一:

如果您希望了解 更多使用該 API 的示例,請參考 NavigationAdvancedSample (它是最新更新的,且不包含任何用於支持多返回棧的 NavigationExtensions 代碼)。

對於 Navigation Compose 的示例,請參考 Tivi。

如果您遇到任何問題,請使用官方的問題追蹤頁面提交關於 Fragment 或者 Navigation 的 bug,我們會盡快處理。

F. android, FragmentManager 能同時管理多個Fragment和ListFragment嗎

能,可以看sdk自帶的apidemos常式,在layout里放置多個framelayout做為fragment的容器,在oncreate時設置listfragment即可

G. Android中綁定Fragment與Activity用哪個方法

1、用FragmentActivity類,自帶綁定管理類,綁定fragment。
2、在Activity中,用fragmentManager管理類,綁定fragment和Activity的關系。

H. android fragment能做什麼

fragment的目的是適應眾多解析度,可以在不同屏幕上動態管理UI.可以將一個activty分成不同的區塊來現實,大屏小屏實現很好的兼容 。
Android是在Android 3.0 (API level 11)開始引入Fragment的。
可以把Fragment想成Activity中的模塊,這個模塊有自己的布局,有自己的生命周期,單獨處理自己的輸入,在Activity運行的時候可以載入或者移除Fragment模塊。
可以把Fragment設計成可以在多個Activity中復用的模塊。
當開發的應用程序同時適用於平板電腦和手機時,可以利用Fragment實現靈活的布局,改善用戶體驗。‍

I. android fragment有什麼用

自從Android 3.0中引入fragments 的概念,其目的是為了解決不同屏幕分辯率的動態和靈活UI設計。大屏幕如平板小屏幕如手機,平板電腦的設計使得其有更多的空間來放更多的UI組件,而多出來的空間存放UI使其會產生更多的交互,從而誕生了fragments 。
fragments 的設計不需要你來親自管理view hierarchy 的復雜變化,通過將Activity 的布局分散到frament 中,可以在運行時修改activity 的外觀,並且由activity 管理的back stack 中保存些變化。當一個片段指定了自身的布局時,它能和其他片段配置成不同的組合,在活動中為不同的屏幕尺寸修改布局配置(小屏幕可能每次顯示一個片段,而大屏幕則可以顯示兩個或更多)。
ITjob網有關於Android的文章和帖子,如果你想了解的更細致的話,可以自己去看看。也可以去相關的論壇,或者大牛的博客看看。希望對你有幫助。

J. 關於Android中fragment的管理

底部使用fragment構建,用fragment元素組成一個集合,接下來使用activity把每個元素都添加進去.調用fragmentPagerAdapter作為適配器排版,然後調用viewpager顯示界面,底下菜單使用button點擊事件觸發,,同時實現滑動與點擊控制界面的效果

閱讀全文

與androidfragment管理相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:755
蘋果郵件無法連接伺服器地址 瀏覽:958
phpffmpeg轉碼 瀏覽:669
長沙好玩的解壓項目 瀏覽:140
專屬學情分析報告是什麼app 瀏覽:562
php工程部署 瀏覽:831
android全屏透明 瀏覽:730
阿里雲伺服器已開通怎麼辦 瀏覽:801
光遇為什麼登錄時伺服器已滿 瀏覽:300
PDF分析 瀏覽:483
h3c光纖全工半全工設置命令 瀏覽:141
公司法pdf下載 瀏覽:381
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:682
如何取消命令方塊指令 瀏覽:348
風翼app為什麼進不去了 瀏覽:777
im4java壓縮圖片 瀏覽:361
數據查詢網站源碼 瀏覽:148
伊克塞爾文檔怎麼進行加密 瀏覽:889
app轉賬是什麼 瀏覽:162