學習安卓開發[2] - 在Activity中托管Fragment

来源:https://www.cnblogs.com/zhixin9001/archive/2018/11/12/9949406.html
-Advertisement-
Play Games

在上一篇 學習安卓開發[1] 程式結構、Activity生命周期及頁面通信 中,學習了Activity的一些基礎應用,基於這些知識,可以構建一些簡單的APP了,但這還遠遠不夠,本節會學習如何使用Activity托管Fragment的方式來進行開發 [TOC] 為什麼需要Fragment 單純使用Ac ...


目錄

在上一篇學習安卓開發[1]-程式結構、Activity生命周期及頁面通信中,學習了Activity的一些基礎應用,基於這些知識,可以構建一些簡單的APP了,但這還遠遠不夠,本節會學習如何使用Activity托管Fragment的方式來進行開發

為什麼需要Fragment

單純使用Activity的局限

為什麼需要Fragment呢,這要從Activity的局限說起。在前面使用Activity的過程中已經發現,Activity很容易被銷毀重建,甚至是在設備旋轉的時候也會被銷毀,為了返回之前的狀態需要保存各種界面相關的信息。
再來假設一種比較常見的場景,一個列表界面+明細界面構成的應用,如果用兩個Activity來實現也可以,但如果用戶在平板設備上運行應用,則最好能同時顯示列表和明細記錄,類似網易雲、QQ那樣在屏幕左側約1/3的區域顯示列表,右側剩餘的區域展示詳細信息,這是使用兩個Activity無法滿足的;另外,查看能否在用戶想查看下一條明細時不必回退、再點擊進入明細界面,而是採用在屏幕橫向滑動切換到下一條這樣的快捷手勢呢,這也是兩個Activity無法滿足的。

Fragment介紹

接下來該是Fragment隆重登場的時候了,可以說Fragment就是為了應對UI的靈活需求而生的,Fragment是在API 11中開始引入的,當時Google發佈了第一臺平板設備。
那麼什麼是Fragment呢,Fragment是一種控制器對象,可以在Activity的托管下進行用戶界面的管理,受其管理的界面可以是整個屏幕區域,也可以是一小部分,Fragment(碎片)就是這個意思。
要讓Activity能夠托管Fragment,則需要activity視圖預留fragment插入其中的位置。一個activity視圖中可以插入過個fragment視圖。Fragment本身沒有在屏幕上顯示視圖的能力,所以它必須放置在Activity的視圖層級中。

如何使用Fragment

代碼實現
容器視圖和Activity

在文件activity_fragment.xml中定義容器視圖:

<FrameLayout android:id="@+id/fragment_container"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

在Activity中定義了一個用於放置Fragment的FrameLayout,這個容器視圖可以托管任意的Fragment。
對應Activity的代碼在CrimeActivity.java為:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_fragment);

    FragmentManager fm = getSupportFragmentManager();
    Fragment fragment = fm.findFragmentById(R.id.fragment_container);
    if (fragment == null) {
        fragment = new CrimeFragment();
        fm.beginTransaction()
                .add(R.id.fragment_container, fragment)
                .commit();
    }
}
FragmentManager

這段代碼的作用是:在資源ID為R.id.fragment_container的FrameLayout容器中,找到fragment,然後判斷獲取的fragment是否為空,如果為空則創建新的名為CrimeFragment的Fragment實例,將其添加到FragmentManager所維護的隊列中,併在容器R.id.fragment_container中顯示。
除了這種用代碼將fragment交給Activity托管的方式,還可以在xml中直接將fragment簽入activity,但為了能夠動態地更換fragment,唯一能採用的便是前面採用的代碼的方式。
在設備旋轉或回收記憶體時,Android系統會銷毀Activity,但FragmentManager會將fragment隊列保存下來。Activity被重建時,新的FragmentManager會首先獲取保存的隊列(這就是使用了Fragment後,不會有像之前那樣旋轉就會設備導致狀態丟失的現象的原因)。所以代碼里會先判斷fragment是否為null,只有為null的時候才會重新向隊列中添加fragment。

Fragment的生命周期

Fragment的生命周期如下圖所示:

可見Fragment的生命周期與Activity的生命周期非常類似,實際上Fragment的許多方法對應著activity的生命周期方法。
Fragment的onCreate方法:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
}

Activity的onCreate方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
}

兩者的區別在於Fragment.OnCreate()是公共方法,而Activity.OnCreate()是受保護方法,Activity的生命周期方法由操作系統調用,而Fragment的生命周期方法則是由托管它的Activity調用的。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、命令介紹 mkdir 命令用於創建空白目錄格式為“mkdir [選項] 目錄”, 除了能夠創建單個空白目錄,還能結合 -p 參數來遞歸創建具有嵌套層疊關係的文件目錄。 二、實例 使用mkdir命令在當前目錄創建一個名為new的文件目錄 執行 mkdir new 可以看到文件目錄 new 已經創建 ...
  • 任務二 表數據的插入、修改及刪除 @[toc] | 班級 | 姓名 | | | | |軟體工程16 9班 | 洪燕妮| 【實訓目的與要求】 1、利用MySQL命令行視窗進行增、刪、改數據操作; 2、利用界面工具進行增、刪、改數據操作。 【實訓原理】 MySQL的增、刪、改數據操作命令。 【實訓步驟】 ...
  • 一.概述 整數集合(intset)是集合鍵的底層實現之一, 當一個集合只包含整數值元素,並且這個集合元素數量不多時, Redis就會使用整數集合作為集合鍵的底層實現。下麵創建一個只包含5個元素的集合鍵,並且集合中所有元素都是整數值,那麼這個集合鍵的底層實現就會是整數集合。 接著添加非整數值,集合鍵的 ...
  • 用戶定義函數定義 與編程語言中的函數類似,SQL Server 用戶定義函數是接受參數、執行操作(例如複雜計算)並將操作結果以值的形式返回的常式。 返回值可以是單個標量值或結果集。 用戶定義函數準則 在函數中,將會區別處理導致語句被取消並繼續執行模塊(如觸發器或存儲過程)中的下一個語句的 Trans ...
  • 本篇博客主要是 sparksql 從初始開發註意的一些基本點以及力所能及的可優化部分的介紹: 所使用spark版本:2.0.0 scala版本:2.11.8 1. SparkSession的初始化: 註意點: a. spark.sql.warehouse.dir 需要顯示設置,否則會拋出 Excep ...
  • 修改安裝目錄下的配置文件 比如:F:\app\admin-PC\product\11.2.0\dbhome_1\network\admin\ 修改這個目錄下的listener.ora和tnsnames.ora ********************************************* ...
  • MySQL8.0的官方社區開源版出來有段時間了,而percona的8.0版本還沒有正式對外發佈(已發佈測試版),一直以來也沒安裝體驗下這個號稱質的飛躍的版本,今天正好有些時間就下了安裝體驗體驗。 一、MySQL8.0下載 下載地址:https://dev.mysql.com/get/Download ...
  • 資料庫 1,簡單說,資料庫就是可以共用數據,防止數據的不一致和重覆。其實簡簡的兩句話包含了好多好多東西。一點點學習吧。 2,最簡單的概念也記錄一下吧:一條數據叫做記錄,各個項目稱為欄位,確定數據的列叫主鍵,使用表格處理數據,基於數學運算(並,差,交,笛卡爾積,投影,選擇,連接,除)來處理數據。 並: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...