Activity->Activity中動態添加Fragment->Fragment回退棧BackStack

Fragment回退棧

  • Fragment回退棧用于管理Fragment的導航歷史(添加、刪除、替換)。每個Activity都有一個包含其所有FragmentFragmentManager,調用其addToBackStack方法時,這個事務就會被添加到FragmentManager的回退棧中
  • 當用戶按下返回鍵時,系統就會從回退棧中彈出并反向執行最近的事務。如果你替換了一個Fragment,并將這個操作添加到了回退棧,那么按下返回鍵時,原來的Fragment會再次出現
  • commitNow()方法不能和addToBackStack()方法一起使用

XML文件

  • Activity 布局文件R.layout.activity_main
<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/replace_child_ll"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@android:color/holo_green_light"android:gravity="center"android:orientation="vertical">
</LinearLayout>
  • 第一次添加的MyFragmentA布局R.layout.inflate_layout_a
<?xml version="1.0" encoding="utf-8"?>
<TextViewxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/inflate_tv_a"android:layout_width="match_parent"android:layout_height="100dp"android:background="@android:color/holo_blue_light" />
  • 第二次添加的MyFragmentB布局R.layout.inflate_layout_b
<?xml version="1.0" encoding="utf-8"?>
<TextViewxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/inflate_tv_b"android:layout_width="match_parent"android:layout_height="100dp"android:background="@android:color/holo_orange_light"/>

Activity代碼和Fragment代碼

  • MyFragmentA代碼
class MyFragmentA : Fragment() {override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {return inflater.inflate(R.layout.inflate_layout_a, container, false)}
}
  • MyFragmentB代碼
class MyFragmentB : Fragment() {override fun onCreateView(inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?): View? {return inflater.inflate(R.layout.inflate_layout_b, container, false)}
}
  • Activity代碼
const val TAG = "Yang"
class MainActivity : AppCompatActivity() {var replaceLl : LinearLayout? = nullvar mMainHandler = Handler(Looper.getMainLooper())override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)replaceLl = findViewById(R.id.replace_child_ll) as? LinearLayout// 添加第一個FragmentmMainHandler.postDelayed({val firstFragment = MyFragmentA()replaceLl?.let {replaceFragmentAddToStack(firstFragment, it)}}, 1000)// 添加第二個FragmentmMainHandler.postDelayed({val secondFragment = MyFragmentB()replaceLl?.let {replaceFragmentAddToStack(secondFragment, it)}}, 2000)}private fun replaceFragmentAddToStack(fragment: Fragment, targetView: View) {val transaction = supportFragmentManager.beginTransaction()transaction?.replace(targetView.id, fragment)?.addToBackStack(null)?.commitAllowingStateLoss()}
}

效果圖

  • 3s后添加藍色背景的MyFragmentA,6s后添加橘色背景的MyFragmentB
  • 按下第一次返回鍵后,最上層的橘色背景的MyFragmentB銷毀,下層藍色背景的MyFragmentA顯示
  • 按下第二次返回鍵后,最上層的藍色背景的MyFragmentA銷毀,下層綠色背景的Activity顯示
  • 按下第三次返回鍵后,最上層的綠色背景的Activity執行onPause()onStop(),應用進入后臺
    在這里插入圖片描述

FragmentManger.popBackStack()

  • 如果在Activity添加Fragment時,通過addToBackStack添加到回退棧,popBackStack的作用和按下返回鍵一樣

replace方式添加+addToBackStack+popBackStack

class MainActivity : AppCompatActivity() {var replaceLl : LinearLayout? = nullvar mMainHandler = Handler(Looper.getMainLooper())override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)replaceLl = findViewById(R.id.replace_child_ll) as? LinearLayout// 添加第一個FragmentmMainHandler.postDelayed({val firstFragment = MyFragmentA()replaceLl?.let {replaceFragmentAddToStack(firstFragment, it)}}, 1000)// 添加第二個FragmentmMainHandler.postDelayed({val secondFragment = MyFragmentB()replaceLl?.let {replaceFragmentAddToStack(secondFragment, it)}}, 2000)// 移除第二個FragmentmMainHandler.postDelayed({supportFragmentManager.popBackStack()}, 3000)// 移除第一個FragmentmMainHandler.postDelayed({supportFragmentManager.popBackStack()}, 4000)}private fun replaceFragmentAddToStack(fragment: Fragment, targetView: View) {val transaction = supportFragmentManager.beginTransaction()transaction?.replace(targetView.id, fragment)?.addToBackStack(null)?.commit()}
}

效果圖

  • 1s添加藍色背景的MyFragmentA
  • 2s添加橘色背景的MyFragmentB,移除藍色背景的MyFragmentA,此時屏幕上只有MyFragmentB
  • 3s移除橘色背景的MyFragmentB,顯示藍色背景的MyFragmentA,此時屏幕上只有MyFragmentA
  • 4s移除橘色背景的MyFragmentA,移除藍色背景的MyFragmentA,此時屏幕上沒有任何Fragment
    在這里插入圖片描述

add方式添加+addToBackStack+popBackStack

class MainActivity : AppCompatActivity() {var replaceLl : LinearLayout? = nullvar mMainHandler = Handler(Looper.getMainLooper())override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)replaceLl = findViewById(R.id.replace_child_ll) as? LinearLayout// 添加第一個FragmentmMainHandler.postDelayed({val firstFragment = MyFragmentA()replaceLl?.let {addFragmentAddToStack(firstFragment, it)}}, 1000)// 添加第二個FragmentmMainHandler.postDelayed({val secondFragment = MyFragmentB()replaceLl?.let {addFragmentAddToStack(secondFragment, it)}}, 2000)// 移除第二個FragmentmMainHandler.postDelayed({supportFragmentManager.popBackStack()}, 3000)// 移除第一個FragmentmMainHandler.postDelayed({supportFragmentManager.popBackStack()}, 4000)}private fun addFragmentAddToStack(fragment: Fragment, targetView: View) {val transaction = supportFragmentManager.beginTransaction()transaction?.add(targetView.id, fragment)?.addToBackStack(null)?.commit()}
}

效果圖

  • 1s添加藍色背景的MyFragmentA
  • 2s添加橘色背景的MyFragmentB,不移除藍色背景的MyFragmentA,此時屏幕上有MyFragmentAMyFragmentB
  • 3s移除橘色背景的MyFragmentB,此時屏幕上只有MyFragmentA
  • 4s移除橘色背景的MyFragmentA,此時屏幕上沒有任何Fragment
    在這里插入圖片描述

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

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

相關文章

MySQL報ERROR 2002 (HY000)解決

今天在連接客戶服務器時MySQL的時候報: ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql/mysql.sock’ (2) [rootXXX ~]# mysql -uroot -p Enter password: ERROR 2002 (HY000): Can’t connect to local MySQL server through socket…

rman恢復后,少部分數據文件狀態為MISSING000**

客戶有套一體機&#xff0c;每天晚上21點開始做rman完全備份&#xff0c;大約第2天上午9點多完成備份&#xff0c;rman備份保留策略保留一份完全備份 6月1日晚21點自動發起備份&#xff0c;6月2日上午10點15分完成備份&#xff0c;并生成了一個控制文件備份 c-4063271871-2024…

前端圖片在切換暗黑模式時太亮該怎么辦?

通過css中的filter屬性來實現&#xff0c;進行圖片的色系反轉、亮度、對比度調整等 1、invert 反轉輸入圖像&#xff0c;值為 100% 則圖像完全反轉&#xff0c;值為 0% 則圖像無變化 filter: invert(1); 2、blur 給元素應用高斯模糊效果。 filter: blur(5px); 3、brightnes…

如何解決網絡問題?

組織和 IT 管理員盡其所能完善他們的網絡&#xff0c;但是&#xff0c;不同程度的網絡問題仍然可能出現&#xff0c;這些網絡問題需要立即響應和解決&#xff0c;如果這些問題在不合理的時間內得不到解決&#xff0c;網絡和組織的損害可能會付出高昂的代價。這就是為什么 IT 管…

【漏洞復現】銳捷校園網自助服務系統 login_judge.jsf 任意文件讀取漏洞(XVE-2024-2116)

0x01 產品簡介 銳捷校園網自助服務系統是銳捷網絡推出的一款面向學校和校園網絡管理的解決方案。該系統旨在提供便捷的網絡自助服務&#xff0c;使學生、教職員工和網絡管理員能夠更好地管理和利用校園網絡資源。 0x02 漏洞概述 校園網自助服務系統/selfservice/selfservice…

css移動端開發

1.視口 視口標簽 視口元標簽&#xff08;Viewport Meta Tag&#xff09;用于控制網頁在移動設備上的視口行為&#xff0c;確保頁面能夠正確縮放和調整。通常在HTML的<head>部分添加如下代碼&#xff1a; <meta name"viewport" content"widthdevice-…

《大道平淵》· 玖 —— 把高深的道理講的通俗,這是一門藝術。

《平淵》 玖 "化繁為簡, 點石成金。" 把高深的道理講得通俗&#xff0c;這是一門藝術&#xff01; 講述者能夠站在群眾的角度&#xff0c;用盡可能簡單通俗的語言來解釋復雜的概念。 講述者需要對概念有深刻的理解&#xff0c;還要有靈活的表達能力。 群眾愿意接受…

從當當網批量獲取圖書信息

爬取當當網圖書數據并保存到本地&#xff0c;使用request、lxml的etree模塊、pandas保存數據為excel到本地。 爬取網頁的url為&#xff1a; http://search.dangdang.com/?key{}&actinput&page_index{} 其中key為搜索關鍵字&#xff0c;page_index為頁碼。 爬取的數據…

15- Redis 中的 整數集合 數據結構

整數集合是 Set 對象的底層實現之一。當一個 Set 對象只包含整數值元素&#xff0c;并且元素數量不大時&#xff0c;就會使用整數集合這個數據結構作為底層實現。 1. 整數集合結構設計 整數集合本質上是一塊連續內存空間&#xff0c;它的結構定義如下&#xff1a; typedef s…

Chrome DevTools 使用攻略

Chrome DevTools是谷歌瀏覽器提供的一套強大的開發工具&#xff0c;對于前端開發人員來說是不可或缺的利器。下面將從多個方面介紹Chrome DevTools的使用攻略&#xff1a; 一、啟動方式 通過快捷鍵&#xff1a; 在Windows/Linux上&#xff0c;按下 F12、Ctrl Shift I 或 C…

集成學習筆記

集成學習 簡介 決策樹 GBDT 擬合殘差 一般 GBDT XGBOOST 弓 1 能表達樣本落入的子節點&#xff0c;但是不能把表示結構 2 3.正則項 – 懲罰 防止過擬合&#xff0c;比如一個值總共有10顆樹都是由同一顆樹決定的&#xff0c;過擬合 5 找到一種方式不依賴于損失函數 …

Android開發之內訪Sqlite數據庫(六)

文章目錄 1. Android開發之外訪Sqlite數據庫1.1 Sqlite數據庫的優點1.2 Sqlite接口簡介接口中的抽象方法接口中的實例方法接口的構造方法示例步驟例子 —— 實現增刪改查 1. Android開發之外訪Sqlite數據庫 SQLite是一個軟件庫&#xff0c;實現了自給自足的、無服務器的、零配…

python的優勢有哪些?

python的優點很多&#xff0c;下面簡單地列舉一些&#xff1a; 簡單 Python的語法非常優雅&#xff0c;甚至沒有像其他語言的大括號&#xff0c;分號等特殊符號&#xff0c;代表了一種極簡主義的設計思想。閱讀Python程序像是在讀英語。 易學 Python入手非常快&#xff0c;學習…

K8s:無狀態

無狀態服務 無狀態服務是指服務的實例之間沒有持久化狀態&#xff0c;每個實例都是相同的&#xff0c;可以互換使用。 調度器 ReplicationController 簡稱 RC是 Kubernetes 早期版本中用來確保 Pod 副本始終運行的 API 對象。它通過監控 Pod 副本的數量&#xff0c;確保任何…

vue 常用的 UI 框架及表格

vue 3 常用的 UI 框架及表格 常用 UI 框架 Element PlusAnt Design VueiViewVxe UIVuetifyBootstrap VueMuse UI 專業表格 SpreadJSAG GridVxe Table

Linux——內存管理代碼分析

虛空間管理 頁框和頁的關系 頁框 將內存空間分為一個個大小相等的分區(比如:每個分區4KB),每個分區就是一個頁框&#xff0c;也叫頁幀&#xff0c;即物理頁面&#xff0c;是linux劃分內存空間的結果。 每個頁框都有一個頁框號&#xff0c;即內存塊號、物理塊號。 頁 將用戶…

深度學習之指數移動平均模型(EMA)介紹

指數移動平均模型&#xff08;Exponential Moving Average Model&#xff0c;EMA&#xff09;是一種用于平滑時間序列數據的技術。它通過對數據進行加權平均來減少噪音和波動&#xff0c;從而提取出數據的趨勢。 在深度學習中&#xff0c;EMA 常常用于模型的參數更新和優化過程…

完整指南:遠程管理 Linux 服務器的 Xshell6 和 Xftp6 使用方法(Xshell無法啟動:要繼續使用此程序........,的解決方法)

&#x1f600;前言 在當今軟件開發領域&#xff0c;遠程管理 Linux 服務器已成為日常工作的重要組成部分。隨著團隊成員分布在不同的地理位置&#xff0c;遠程登錄工具的使用變得至關重要&#xff0c;它們為開發人員提供了訪問和管理服務器的便捷方式。本文將介紹兩款功能強大的…

python隨機顯示四級詞匯 修改版直接顯示釋義

python隨機顯示四級詞匯 修改版直接顯示釋義 添加暫停 和繼續(按下中建滾輪觸發) 按下右鍵 退出程序 解決在暫停后 ,重新調用update_word 會明顯發現每隔5秒更新一次單詞的速率已經改變 速率改變的問題可能是由于暫停期間沒有清除之前的定時器所導致的。為了確保重新調用updat…

Linux高級進階-ssh配置

Ubuntu-system 允許使用root遠程登陸 apt install ssh -y在/etc/ssh/sshd_config 文件修改PermitRootLogin yes systemctl restart ssh遠程連接軟件用戶名為root