安卓APP_ Fragment(1)—— Fragment概念、基础用法、动态变换、管理栈
摘自:安卓APP_ Fragment(1)—— Fragment概念、基礎用法、動態變換、管理棧
作者:丶PURSUING
發布時間: 2021-04-15 23:32:31
網址:https://blog.csdn.net/weixin_44742824/article/details/115716359
目錄
- 一、Fragment是什么
- Fragment的產生原因
- Fragment兩個重要特性
- 具備生命周期
- 寄宿在Activity中運行
- 二、Fragment基礎用法
- 簡單演示
- (1)New創建一個Activity
- (2)添加一個空白的Fragment
- (3)Fragment 綁定到宿主Activity
- (4)在Activity中創建兩個Fragment
- 具體細節在代碼中呈現
- 三、Fragment的動態變換
- 簡單演示
- (1)創建FrameLayout布局
- (2)創建Button的響應事件
- (3)在點擊事件中切換fragment到FragmentLayout
- (4)實現切換的方法:replaceFragment
- 具體細節在代碼中呈現
- 四、fagment有屬于自己的管理棧
一、Fragment是什么
Fragment的產生原因
Fragment很像是小的,簡短的Activity。
Fragment在安卓3.0后才開始出現,當時安卓系統開始大量地應用在平板上。為了平板界面動態的靈活設計,為了能夠讓Activity更加簡潔地配置界面,在平板的開發中就大量的使用了Fragment。
具體可以體現在下圖中:點擊左邊的節目列表,就能跳轉到對應的新的界面
而在手機上,新聞列表(Fragment)通常占滿一整個屏幕,點擊后跳轉到具體的內容即新的界面(Fragment),可以讓這兩個Fragment運行在同一個Activity之上,也可以在不同的Activity上。
而當下,Fragment從原來滿足平板設計的需求,也變成了實現UI的轉變。
Fragment兩個重要特性
具備生命周期
跟以往介紹的view不同,具備有自己的生命周期,因為有生命周期,所以:
(1)可以在一個Activity中組合使用多個Fragment,從而構成多窗格的界面。
(2)可以同時在多個Activity重復使用某一個Fragment
(3)Fragment還可以自己接收輸入事件(所以可以在Activity正在運行的時候動態添加和刪除Fragment)
這樣的效果可以讓Fragment相對于Activity更加地靈活,可以將前者視為后者的模塊化組成部分。
寄宿在Activity中運行
必須要委托在Activity中才能運行(必須有宿主),意味著Fragment生命周期受到Activity的影響,當Activity生命周期結束時,其也跟著結束。
二、Fragment基礎用法
用的最多的就是Fragment + ViewPage 構成的可以滑動切換界面的效果,類似于微信的界面(網圖),當然后面深入了才能實現,在這一篇章僅僅是入門。
簡單演示
在同一個Activity中添加兩個Fragment,實現如下效果:Fragment中的Button響應了點擊事件并把TextView中的內容更改。
實現過程如下,一起體驗Fragment的創建:
(1)New創建一個Activity
新建工程后先把原來自帶的Mainactivity.java和其對應的xml布局文件刪除,我們自己新建一個Mainactivity.java。
創建后,選擇加載Activity。
創建后結果如下圖:
與上圖對比,刪除一些文件,并且修改activity_main.xml為空白模板:
(2)添加一個空白的Fragment
修改BlankFragment1.java的內容,留下下圖中的基本的框架:
然后在BlankFragment1.java對應的xml文件中添加一個TextView和一個Button方便后續演示
在BlankFragment1.java中解析fragment_blank1.xml
添加Fragment響應點擊事件:
(3)Fragment 綁定到宿主Activity
在activity_main.xml中添加:
(4)在Activity中創建兩個Fragment
如法炮制,暴力復制快速演示:
直接復制原來的BlankFragement1.java為BlankFragement2.java
在activity_main.xml中添加(注意更改id哦)
具體細節在代碼中呈現
MainActivity.java
public class MainActivity extends AppCompatActivity {@Override//onCreat創建一個activity的過程protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);} }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout 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"android:orientation="vertical"tools:context=".MainActivity"><!-- 這個name意味著我們創建的是BlankFragment1,相當于進行了綁定fragment作為一個特殊的控件,必須存在id--><fragment android:name="com.example.myfragment.BlankFragment1"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:id="@+id/fragment1"/><fragment android:name="com.example.myfragment.BlankFragment1"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:id="@+id/fragment2"/></LinearLayout>- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
BlankFragment1.java與BlankFragment2.java一毛一樣
public class BlankFragment1 extends Fragment {private View root;//創建的全局變量private TextView tv;private Button btn;@Override//在Activity中會使用setContentView進行解析,而Fragment不一樣public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {//因為onCreateView是一個生命周期函數,要先進行判斷,為null再解析xmlif(root == null) {//用inflater解析器進行xml解析// xml的副本,直接containerroot = inflater.inflate(R.layout.fragment_blank1, container, false);}//創建按鍵響應事件,按鈕按下改變TextViewtv = root.findViewById(R.id.tv);btn = root.findViewById(R.id.btn);btn.setOnClickListener(new View.OnClickListener() {@Override//點擊后把Textview中的文字修改public void onClick(View v) {tv.setText("i am find");}});//onCreateView的返回值為Viewreturn root;} }- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
fagment_blank1.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".BlankFragment1"><!-- TODO: Update blank fragment layout --><TextViewandroid:layout_width="match_parent"android:layout_height="40dp"android:id="@+id/tv"android:textSize="20dp"android:textColor="#ff0000"android:text="hello_blank_fragment" /><Buttonandroid:layout_width="match_parent"android:layout_height="40dp"android:text="how are you?"android:id="@+id/btn"/></LinearLayout>- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
三、Fragment的動態變換
簡單演示
演示說明:在main_activity.xml中創建有FragmentLayout布局,當點擊按鈕時,響應點擊事件切換fragment到FragmentLayout上。
(1)創建FrameLayout布局
在activity_main.xml中創建FrameLayout的布局。之后進行fragment的切換都是在這個布局上進行。
(2)創建Button的響應事件
首先要創建兩個示例fragment,我這里直接創建的是空白(blank)的和列表(item)的
按鈕監聽:
(3)在點擊事件中切換fragment到FragmentLayout
(4)實現切換的方法:replaceFragment
具體細節在代碼中呈現
為了方便演示,直接new生成兩個系統自帶的fragment。
MainActivity.java
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
activity_main.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"><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/btn_1"android:text="@string/change"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/btn_2"android:text="@string/replace"/><!-- 除去按鈕,剩余的空間都是FrameLayout--><FrameLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/fm"android:background="@color/teal_200"/></LinearLayout>- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
fragment_blank1.xml
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".BlankFragment1"><!-- TODO: Update blank fragment layout --><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:background="#ffff00"android:textSize="40dp"android:text="@string/hello_blank_fragment" /></FrameLayout>- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
四、fagment有屬于自己的管理棧
在上一小節 三、Fragment的動態變換 中,點一次返回鍵后就退出了。
體驗fagment的入棧與出棧,理解fagment的管理棧
效果如下:
為何點擊6此入棧五個呢?因為最后一個點擊的正在顯示界面。
具體的實現只需要在上一小節 三、Fragment的動態變換 方法中添加一句入棧代碼。
總結
以上是生活随笔為你收集整理的安卓APP_ Fragment(1)—— Fragment概念、基础用法、动态变换、管理栈的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android回忆启示录
- 下一篇: C语言实现俄罗斯方块