【Android】Fragment的簡單筆記

被虐了,做某公司筆試時,發現自己連個Fragment的生命周期都寫不詳細。平時敲代碼,有開發工具的便利,有網上各大神的文章,就算忘了也很容易的可以查到,但當要自己不借助外界,卻發現自己似乎對該知識點并不是很理解。
所以,還是老老實實的做好筆記。本篇隨筆介紹的是Fragment,這類的文章網上很多,題主還是個小渣,就只是簡單的記錄,借機鞏固基礎,如果有理解錯的地方,還望指點一下。


Fragment介紹

關于Fragment的介紹網上很多,有說是用來支持不同屏幕手機的布局的,官網上也介紹說能給用戶提供一種動態、靈活的交互體驗。
但對于一個新手來說,學習的層面,很少需要去考慮到適配不同屏幕手機的需求。畢竟新手更多的是學習一個知識點如何使用,而不是做一個產品出來。所以新手對Fragment接觸的頻率可能會比較少,畢竟簡單的程序Activity就可以滿足了。
題主也是小渣一枚,對于Fragment的理解,更多的是覺得它的動態增加、移除、替換非常實用。
因為新手學習常常是模仿一些比較出名的App,很多App都會有統一的標題欄、底部欄之類的,更換的只是內容區的界面,這種情況如果還只是用Activity來實現,項目里就會有大量重復的代碼,后期需要修改某個地方,將是一件恐怖的事。所以,這時候使用Fragment就非常好了。

Fragment生命周期

Fragment是依附于Activity存活的,網上也說可以將Fragment看成是迷你型的Activity,這樣一來,Fragment的生命周期也就很容易理解了。先附上張圖:

810210-20160526170900897-1710664205.jpg

因為Fragment是依附于Activity的,所以當Activity執行完onCreate后,Fragment也就相應的執行它的回調函數。
這里也很好理解,首先是先關聯,關聯成功后創建對象,接著創建視圖。摧毀時正好反過來,先摧毀視圖,然后摧毀對象,最后再取消關聯。其他回調函數都跟Activity一樣。

剛學習時可以把日志打印出來,自己琢磨幾遍也就清楚流程了,如下圖:

①onCreate --> onResume (onResume后Activity/Fragment就處于運行狀態:可見,有焦點,可交互)

810210-20160526171657725-1478535029.jpg

②onStop --> onRestart --> onResume (當活動從后臺重新進入前臺時執行的回調函數)

810210-20160526171717366-1874013906.jpg

③摧毀過程

810210-20160526171726678-1044302690.jpg

Fragment使用

首先是了解,了解完后就要開始學習該怎么使用了。網上都介紹說有兩種方式,靜態和動態。其實也就是要么在布局文件xml中直接把Fragment當成普通的組件使用,要么在java代碼中動態的添加、替換、移除。有些類似于廣播的使用方式。

①靜態使用

首先先創建一個Fragment的布局文件:fragment_phone.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:text="PHONT" />
</LinearLayout>

然后創建一個FragmentPhone類繼承自Fragment:FragmentPhone.java

public class FragmentPhone extends Fragment {@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {Log.d(TAG, "onCreateView");return inflater.inflate(R.layout.fragment_phone, container, false);}}

至于為什么要創建這個類,題主的理解是:因為要把Frament當成普通的組件在布局文件中使用,但Fragment的布局是由我們自己定義決定的,所以可以把它當成是自定義組件,那就按照自定義UI的方式來操作了。
onCreateView也就類似于Activity的onCreate,我們需要在這里為我們的Fragment指定相應的布局文件。

最后就是在Activity的布局文件中使用:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"app:layout_behavior="@string/appbar_scrolling_view_behavior"tools:context="com.iwin.fragment01.MainActivity"tools:showIn="@layout/app_bar_main"><fragmentandroid:name="com.iwin.fragment01.FragmentPhone"android:layout_width="match_parent"android:layout_height="match_parent" />
</RelativeLayout>

使用fragment標簽,和android:name屬性來指定具體的Fragment就大功告成了。

總結下,靜態使用方法:創建Fragment布局文件 ---> 創建FragmentPhone類繼承Fragment,在onCreateView方法中指定布局文件 ---> 使用fragment標簽和android:name屬性來指定使用哪個Fragment。

②動態使用

首先創建Fragment布局文件,跟靜態使用時第一步一樣。

然后創建Fragment***類繼承Fragment,在onCreateView方法中指定布局文件,仍然跟靜態使用的第二步一樣。

最后在Activity類的onCreate方法中使用:

public class MainActivity extends AppCompatActivity {private FragmentPhone fphone;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.i(TAG,"onCreate");setContentView(R.layout.activity_main);if (savedInstanceState == null){FragmentManager fm = getFragmentManager();FragmentTransaction ft = fm.beginTransaction();fphone = new FragmentPhone();ft.add(R.id.content,fphone);ft.commit();}}
}

先獲取FragmentManager的對象,然后開啟一個事務,指定操作(添加,替換,移除,隱藏等),最后提交事務就可以了。
至于為什么要通過事務來操作Fragment,題主的理解是:因為一個過程我們可以指定多個操作,比如隱藏當前Fragmetn,然后再添加一個新的Fragment進來等等,如果在完成部分操作時程序出問題了,那么這時界面就會處于一個奇怪的現狀。而事務可以保證操作要么全部完成,要么一個都不做。
其實也就是從數據庫的事務概念來理解了,也不知道對不對,至少這樣理解可以加深點印象。

對Fragment的操作(添加,替換,移除等)需要通過FragmentTransaction提供的API來操作,FragmentRransaction實例可以通過FragmentManager類的benginTransaction()獲得。而FragmentManager的實例則可以通過Activity的getFragmentManager()獲取。

對Fragment的操作示例:(ft是FragmentTransaction 的一個實例對象。)

添加

ft.add(R.id.content,fphone);
第一個參數是指定一個來放置你的Fragment的ViewGroup(FrameLayout等),第二個參數就是一個Fragment的實例對象。

替換

ft.replace(R.id.content,fcamera);
參數同上。

總結下,動態使用Fragment前兩步跟靜態一樣,需要創建Fragment布局文件和類 ---> 通過Activity的getFragmentManager()獲取FragmentManager實例 ---> 通過FragmentManager的beginTransaction()獲取FragmentTransaction的實例 ---> 調用獲取FragmentTransaction的API,如ft.add(要放置Fragment的ViewGroup,Fragment實例) ---> 提交事務如ft.commit()


暫時就先記錄這些基礎的知識點了,后面等用多了Fragment,對于與Activity的通信,以及一些其他特殊的用法熟悉了再來做筆記。

轉載于:https://www.cnblogs.com/dasusu/p/5532280.html

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

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

相關文章

HALCON示例程序color_fuses.hdev通過顏色對保險絲進行分類

HALCON示例程序color_fuses.hdev通過顏色對保險絲進行分類 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_update_window (‘off’)定義字符串變量并初始化 FuseColors : [‘Orange’,‘Red’,‘Blue’,‘Yellow’,‘Green’] FuseTypes : [5,10,15,20…

三、致敬“張正友標定”

三、致敬“張正友標定” 此處“張正友標定”又稱“張氏標定”&#xff0c;是指張正友教授于1998年提出的單平面棋盤格的攝像機標定方法。張氏標定法已經作為工具箱或封裝好的函數被廣泛應用。張氏標定的原文為“A Flexible New Technique forCamera Calibration”。此文中所提到…

Using KernelShark to analyze the real-time scheduler【轉】

轉自&#xff1a;https://lwn.net/Articles/425583/ This article brought to you by LWN subscribers Subscribers to LWN.net made this article — and everything that surrounds it — possible. If you appreciate our content, please buy a subscription and make the …

無縫滾動的算法

一早上的時間做了一個簡單的無縫滾動&#xff0c;遇到的問題特別的多&#xff0c;而且對無縫滾動的算法也不是特別的清楚。 無縫滾動效果的原理&#xff1a;就是幾個圖片 浮動成為一排&#xff1b;然后讓圖片滾動&#xff0c;正常情況下圖片滾完&#xff0c;就留下了后面的空白…

ACM題目————一筆畫問題

描述 zyc從小就比較喜歡玩一些小游戲&#xff0c;其中就包括畫一筆畫&#xff0c;他想請你幫他寫一個程序&#xff0c;判斷一個圖是否能夠用一筆畫下來。 規定&#xff0c;所有的邊都只能畫一次&#xff0c;不能重復畫。 輸入第一行只有一個正整數N(N<10)表示測試數據的組數…

HALCON示例程序color_fuses_lut_trans.hdev通過顏色對保險絲進行分類

HALCON示例程序color_fuses_lut_trans.hdev通過顏色對保險絲進行分類 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_update_off ()定義變量并初始化&#xff0c;這些變量都是下邊識別要用到的 FuseColors : [‘Orange’,‘Red’,‘Blue’,‘Yellow’,…

上海電驅動

從行業前景上來說還可以&#xff0c;但這個公司不行&#xff0c;公司各種坑&#xff0c;從上到下各種腐敗&#xff0c;打醬油的人比較多&#xff0c;在薪資方面除了技術部稍好一點&#xff0c;其他部門我建議你最好別去了&#xff0c;整體上這個公司員工沒幸福感&#xff01;只…

1056. 組合數的和(15)

1056. 組合數的和(15) 時間限制400 ms內存限制65536 kB乙級練習題解目錄給定N個非0的個位數字&#xff0c;用其中任意2個數字都可以組合成1個2位的數字。要求所有可能組合出來的2位數字的和。例如給定2、5、8&#xff0c;則可以組合出&#xff1a;25、28、52、58、82、85&#…

3、時間和隨機數

一、時間 1.1 使用Calendar/[?kl?nd?]/類獲取時間 1.1.1 常用方法 (1)public static Calendar getInstance&#xff08;&#xff09;: 使用默認時區和語言環境獲取一個基于當前時間的Calendar對象。 (2)public int get(int field) 返回給定日歷字段表示的日歷部分的數字…

哥尼斯堡的“七橋問題” (歐拉回路,并查集)

哥尼斯堡的“七橋問題” (25分) 哥尼斯堡是位于普累格河上的一座城市&#xff0c;它包含兩個島嶼及連接它們的七座橋&#xff0c;如下圖所示。 可否走過這樣的七座橋&#xff0c;而且每橋只走過一次&#xff1f;瑞士數學家歐拉(Leonhard Euler&#xff0c;1707—1783)最終解決…

HALCON示例程序color_pieces.hdev通過MLP訓練器對彩色棋子進行分類識別

HALCON示例程序color_pieces.hdev通過MLP訓練器對彩色棋子進行分類識別&#xff1b;分別在彩色圖像下與灰度圖像下進行&#xff0c;從而產生對比。 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_update_off () dev_close_window () dev_open_window (…

無人駕駛汽車之爭本田為何未戰先敗

摘要 : 本田汽車的研發部門對于汽車雖然理解深刻&#xff0c;但從整體而言&#xff0c;本田的造車理念還停留在上個時代&#xff0c;在未來的無人駕駛競爭中&#xff0c;本田已經有未戰先啊敗的苗頭。 百度百家The BIG Talk硅谷站連續5小時的高密度頭腦風暴&#xff0c;果然讓人…

理解git結構與簡單操作(四)合并分支的方法與策略

接上節&#xff0c;此時的dev分支與master分支的進度就不一樣了&#xff0c;所以需要將dev分支與master分支同步。這里需要的就是合并分支的操作&#xff0c;大家應該都知道用git merge或者git rebase。 git merge merge&#xff0c;即「合并」。 fast-forward 當出現我們上面圖…

HALCON示例程序color_segmentation_pizza.hdev披薩肉餅識別。

HALCON示例程序color_segmentation_pizza.hdev披薩肉餅識別。 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_update_off () dev_close_window () read_image (Image, ‘color/pizza_01’) get_image_size (Image, Width, Height) dev_open_window (0,…

攝像機標定

利用攝像機所拍攝到的圖像來還原空間中的物體。在這里&#xff0c;不妨假設攝像機所拍攝到的圖像與三維空間中的物體之間存在以下一種簡單的線性關系&#xff1a;[像]M[物],這里&#xff0c;矩陣M可以看成是攝像機成像的幾何模型。 M中的參數就是攝像機參數。通常&#xff0c;這…

Linux下Tomcat重新啟動

在Linux系統下&#xff0c;重啟Tomcat使用命令操作的&#xff01; 首先&#xff0c;進入Tomcat下的bin目錄 cd /usr/local/tomcat/bin 使用Tomcat關閉命令 ./shutdown.sh 查看Tomcat是否以關閉 ps -ef|grep java 如果顯示以下相似信息&#xff0c;說明Tomcat還沒有關閉 root …

大數據和人工智能的關系是什么?

何為大數據&#xff1f;何為人工智能&#xff1f; 大數據&#xff0c;百度百科上是這么定義的&#xff0c;指無法在一定時間范圍內用常規軟件工具進行捕捉、管理和處理的數據集合&#xff0c;是需要新處理模式才能具有更強的決策力、洞察發現力和流程優化能力的海量、高增長率…

【2017-03-09】SQL Server 數據庫基礎、四種約束

一、數據庫和內存的區別 數據庫&#xff1a;一些存儲在硬盤上的數據文件 內存&#xff1a;計算機臨時存儲的一些數據 二、常用數據庫 .Net - SQL Server PHP - MySql Java - Oreacl 三、SQL Server使用方法 1、新建數據庫 右鍵點擊“數據庫”&#xff0c;點擊“新建數據庫”。在…

HALCON示例程序color_simple.hdev在HSV空間篩選黃色線

HALCON示例程序color_simple.hdev在HSV空間篩選黃色線 示例程序源碼&#xff08;加注釋&#xff09; 關于顯示類函數解釋 dev_close_window () dev_open_window (0, 0, 640, 480, ‘black’, WindowHandle) for i : 1 to 2 by 1 read_image (Image, ‘cable’ i) 將彩色圖片…

張正友標定法 【計算機視覺學習筆記--雙目視覺幾何框架系列】

三、致敬“張正友標定” 此處“張正友標定”又稱“張氏標定”&#xff0c;是指張正友教授于1998年提出的單平面棋盤格的攝像機標定方法。張氏標定法已經作為工具箱或封裝好的函數被廣泛應用。張氏標定的原文為“A Flexible New Technique forCamera Calibration”。此文中所提到…