Android入門(10)| Fragment碎片詳解

文章目錄

  • 為什么要使用碎片(Fragment)
  • 實例
    • 布局文件
    • Fragment
    • Activity
  • 動態添加碎片
    • 布局文件
    • Fragment
    • Activity
  • 碎片通信
    • Fragment
    • 布局文件
    • Activity
  • 生命周期


為什么要使用碎片(Fragment)

我們在手機上看新聞可能是這樣的:

  • RecyclerView 顯示了一組新聞標題
  • 點擊一個新聞后會跳轉到新界面顯示詳細內容
    在這里插入圖片描述
    但當設備屏幕很大時,我們完全可以將 RecyclerView詳細內容 分別放在兩個 碎片 中,然后引入同一個 活動
    在這里插入圖片描述
    Fragment 的定義為小活動,同樣具有生命周期,但比一個 Activity 更細化的管理空間。

實例

布局文件

定義兩個布局文件:

left_fragment.xml

<LinearLayout android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"xmlns:android="http://schemas.android.com/apk/res/android"><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:text="Button"/></LinearLayout>

right_fragment.xml

<LinearLayout android:layout_width="match_parent"android:layout_height="match_parent"android:background="#00ff00"android:orientation="vertical"xmlns:android="http://schemas.android.com/apk/res/android"><TextViewandroid:id="@+id/tx1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:textSize="20sp"android:text="This is right fragment"/></LinearLayout>

fragment_layout.xml

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><fragmentandroid:id="@+id/left_fragment"android:name="com.example.activitytest.Fragment.LeftFragment"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/><fragmentandroid:id="@+id/right_fragment"android:name="com.example.activitytest.Fragment.RightFragment"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/>
</LinearLayout>

Fragment

LeftFragment.java

public class LeftFragment extends Fragment {@Override// 重寫Fragment中onCreateView方法public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragmentreturn inflater.inflate(R.layout.left_fragment, container, false);}
}

RightFragment.java

public class RightFragment extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragmentreturn inflater.inflate(R.layout.right_fragment, container, false);}
}

Activity

FragmentActivity.java

public class FragmentActivity extends AppCompatActivity {protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.fragment_layout);}
}

運行結果:
在這里插入圖片描述


動態添加碎片

Fragment 碎片的真正強大的地方在于可以在程序運行過程中動態地添加到活動中,下面將做一個點擊按鈕切換右邊碎片的案例:

布局文件

rightfrag_two.xml

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:background="#ffff00"android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:id="@+id/tx2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:textSize="20sp"android:text="This is another right fragment"/>
</LinearLayout>

修改 fragment_layout.xml,將右側碎片替換成一個 FrameLayout 布局:

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><fragmentandroid:id="@+id/left_fragment"android:name="com.example.activitytest.Fragment.LeftFragment"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/><!--<fragmentandroid:id="@+id/right_fragment"android:name="com.example.activitytest.Fragment.RightFragment"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/>--><FrameLayoutandroid:id="@+id/right_layout"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1"/>
</LinearLayout>

Fragment

public class RightFragTwo extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {return inflater.inflate(R.layout.rightfrag_two, container, false);}
}

Activity

修改 FragmentActivity.java,實現通過點擊 左側 Button 按鈕來動態替換 RightFragmentRightFragTwo 兩個碎片:

public class FragmentActivity extends AppCompatActivity implements View.OnClickListener {int type = 1; // 輔助判斷當前right_layout的布局是RightFragment還是RightFragTwoprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.fragment_layout);Button button1 = findViewById(R.id.button_1); // fragment_layout.xml中replaceFragment(new RightFragment());button1.setOnClickListener(this);}private void replaceFragment(Fragment fragment){// 獲取碎片管理器FragmentManager supportFragmentManager = getSupportFragmentManager();// 獲取事務,beginTransaction開啟一個事務FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction();// 提供 容器id 和 待添加的碎片實例,實現像容器內動態替換碎片fragmentTransaction.replace(R.id.right_layout, fragment);// 提交事務fragmentTransaction.commit();}@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.button_1:if(type == 1){replaceFragment(new RightFragTwo());type = 2;}else{replaceFragment(new RightFragment());type = 1;}break;}}
}

此時雖然實現了動態替換,但是會發現直接點擊 Back 會退出程序,可以使用 fragmentTransaction.replace(R.id.right_fragment, fragment); 方法,它可以接受一個名字用于描述返回棧的狀態,一般傳入 null 即可:
在這里插入圖片描述


碎片通信

碎片通信又可細分為 碎片和活動之間進行通信碎片和碎片之間通信。這里實現前者的一個實例:

Fragment

修改一下 RightFragment.java,在其中添加一個 TextView 成員,用于在其它類中管理 TextView 的內容:

public class RightFragment extends Fragment {public TextView textView;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragmentView view = inflater.inflate(R.layout.right_fragment, container, false);textView = view.findViewById(R.id.tx1);return view;}
}

布局文件

left_fragment.xml 中再添加一個 button_2

    <Buttonandroid:id="@+id/button_2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:text="send"/>

其作用是更改 RightFragment.javaTextView 的內容。為了實現這一功能,我們需要修改 FragmentActivity.java 文件:

Activity

創建 button_2 的實例 button2,并設置監聽事件:
在這里插入圖片描述
onClick 方法中完善點擊 button2 之后的操作:
在這里插入圖片描述

  • 通過 findFragmentById 方法獲取并創建相應碎片的實例
  • 通過設置該實例更改 TextView 控件的內容

運行結果:
在這里插入圖片描述


生命周期

碎片的生命周期內有四種狀態:

  • 運行狀態: 當一個碎片是可見的,并且所關聯的活動也是正在處于運行狀態的時候,該碎片處于運行狀態。
  • 暫停狀態: 當一個活動處于暫停狀態時(另一個未占滿屏幕的活動處于棧頂),與它相關聯的可見碎片也處于暫停狀態。
  • 停止狀態: 當一個活動處于停止狀態時,與它相關聯的碎片也會進入到停止狀態,或者調用了 FragmentTransactionremove()replace() 方法將碎片從活動中移除,并且在事務提交之前調用 addToBackStack() 方法,這時碎片也會進入到停止狀態。進入到停止狀態的碎片對用戶來說是完全不可見的,也有可能會被系統回收。
  • 銷毀狀態: 當活動被銷毀時,與它相關聯的碎片也會進入到銷毀狀態,或者調用了 FragmentTransactionremove()replace() 方法將碎片從活動中移除,并且在事務提交之前沒有調用 addToBackStack() 方法,碎片也會進入到銷毀狀態。

活動中有的回調方法碎片中幾乎都有,且提供了一些附加的回調方法:

  • onAttach(): 當碎片和活動建立關聯的時候調用
  • onCreateView(): 為碎片創建視圖(加載布局)時調用
  • onActivityCreated(): 確保與碎片相關聯的活動一定已經創建完畢的時候調用
  • onDestroyView(): 當與碎片關聯的視圖被移除的時候調用
  • onDetach(): 當碎片和活動解除關聯的時候調用

在這里插入圖片描述

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

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

相關文章

Android開發(1) | Fragment 的應用——新聞應用

文章目錄Item&#xff1a;標題子項布局文件Java代碼標題碎片布局文件Java代碼新聞內容碎片布局文件Java代碼新聞內容活動布局文件Java代碼首界面布局文件Java代碼Item&#xff1a;標題子項 布局文件 news_item.xml&#xff1a; <TextViewxmlns:android"http://schema…

Java Web整體異常處理

在實際的J2EE項目中&#xff0c;系統內部難免會出現一些異常&#xff0c;就如StrutsSpringHibernate項目&#xff1a;通常一個頁面請求到達后臺以后&#xff0c;首先是到action&#xff08;就是MVC中的controller&#xff09;&#xff0c;在action層會調用業務邏輯層service&am…

Android入門(11)| 全局廣播與本地廣播

文章目錄廣播概念接收廣播動態注冊實例靜態注冊實例發送廣播發送標準廣播廣播的跨進程特性發送有序廣播本地廣播廣播概念 Android 中的每個應用程序都可以對自己感興趣的廣播進行注冊&#xff0c;這樣該程序就只會接收到自己所關心的廣播內容&#xff0c;這些廣播可能是來自系…

Android開發(2) | 廣播 Broadcast 的應用——強制下線功能

文章目錄功能簡介關閉所有活動登陸界面發送強制下線的廣播廣播接收器AndroidManifest.xml運行結果功能簡介 強制下線功能只需要彈出一個對話框&#xff0c;讓用戶只能點擊確定按鈕&#xff0c;回到登錄界面。 如果在每一個活動中添加一個對話框的話太過繁瑣&#xff0c;用廣播…

Android入門(12)| 數據持久化

文章目錄數據持久化文件存儲將數據存儲進文件實例從文件中讀取數據實例SharedPreferences存儲將數據存儲進文件實例從文件中讀取數據實例實現記住密碼的功能SQLite數據庫存儲創建自己的幫助類調用自己的幫助類補全 onUpgrade() 方法增刪查改增&#xff1a;SQLiteDatabase.inser…

Android入門(13)| Android權限 與 內容提供器

文章目錄普通權限與危險權限運行時申請權限內容提供器運用安卓封裝好的內容提供器自實現的內容提供器概念實現普通權限與危險權限 主要用于不同應用程序之間在保證被訪數據的安全性的基礎上&#xff0c;實現數據共享的功能。 在 Android 6.0 開始引入了運行時權限的功能&…

Java實現身份證號碼的驗證,JAVA后臺驗證身份證號碼

代碼如下&#xff1a; package cn.gov.csrc.util;/*** 18 位身份證驗證器* * author admin* */ public class IDCard {final int[] wi { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 };final int[] vi { 1, 0, X, 9, 8, 7, 6, 5, 4, 3, 2 };private int[] ai n…

Android入門(14)| 通知

文章目錄創建通知點擊效果其它小功能實例創建通知 創建通知的步驟&#xff1a; 管理通知的 NotificationManager&#xff0c;通常通過當前 Context 的 getSystemService() 獲取實例。它接受一個字符串參數用于確定獲取系統的什么服務。Android 8.0(O) 版本后需要通知通道&…

Android開發(3) | 權限和內容提供器的應用——調用相機和相冊

文章目錄拍照并保存到 ImageView 控件布局文件 notice_layout.xml按鈕 button_takePhoto 的點擊操作隱式 Intent 啟動后的回調AndroidManifest.xml從相冊選取照片并在 ImageView 控件中顯示布局文件 notice_layout.xml按鈕 button_takePhoto 的點擊操作自定義打開相冊的方法 op…

Android開發(4) | 系統權限、MediaPlayer類 和 VideoView類 的應用——播放多媒體文件

文章目錄MediaPlayer類播放音頻的實例VideoView類播放視頻的實例MediaPlayer類 對多種格式的音頻文件提供了全面的控制方法&#xff1a; 如何獲得MediaPlayer實例&#xff1f; 通過構造函數&#xff1a; MediaPlayer mp new MediaPlayer();調用 MediaPlayer.create() 方法&…

Android入門(15)| 網絡

文章目錄WebViewHTTP使用HttpURLConnection使用OkHttp封裝網絡操作封裝HttpURLConnection封裝OkHttpWebView WebView 可以在 應用程序中&#xff08;而不是瀏覽器&#xff09; 展示一些網頁。 布局文件 web_layout.xml&#xff1a; <LinearLayoutxmlns:android"http…

Java-單例模式

單例模式相信大家都不陌生&#xff0c;在JAVAEE應用中&#xff0c;單例模式是一種應用非常廣泛的設計模式&#xff0c;應用中許多組件都只需要單個實例&#xff0c;下面介紹單例模式。 使用單例模式的優點&#xff1a; 1.減少創建JAVA實例所帶來的系統開銷。 2.便于系統跟蹤單…

Android入門(16)| 服務

文章目錄概念Android 多線程繼承 Thread繼承 Runable 接口匿名類異步消息處理AsyncTask使用服務框架啟動/停止服務綁定/解綁服務服務的生命周期前臺服務IntentService完整版下載示例下載過程的回調接口&#xff1a;DownloadListener繼承 AsyncTask 實現下載功能&#xff1a;Dow…

2020德勤面試開始了嗎_2020國考面試開始,近期面試公告匯總,附結構化小組面試流程...

2020年國家公務員考試面試環節逐步恢復考試&#xff0c;各個招錄部門已經發布面試考察公告&#xff0c;對于進入面試環節的國考考生來說&#xff0c;有必要了解近期國考面試的招錄動態&#xff0c;提前做好面試準備。2020國考國家統計局機關面試面試確認&#xff1a;請進入面試…

項目積壓需求項目計劃_需求變更頻繁,項目經理如何做好需求管理?

項目實施過程中&#xff0c;項目經理常常面臨一個重大挑戰——需求變更。需求變更無處不在&#xff0c;市場條件變化、新業務出現、戰略目標調整、客戶需求修改、資源限制等&#xff0c;都會造成需求變更。需求變更會影響項目的時間、成本和質量&#xff0c;對整個項目和團隊成…

Android | Sensor.TYPE_ORIENTATION被廢棄后的解決辦法

文章目錄概述getOrientation 方法根據 旋轉矩陣R 獲取 設備旋轉弧度getRotationMatrix 方法根據 地磁場、加速度傳感器對象 獲取 旋轉矩陣R代碼參考資料概述 Sensor.TYPE_ORIENTATION 常數在 API 8 中已棄用&#xff0c;官方推薦使用 SensorManager.getOrientation() 替代。關…

【JAVA 開發小問題】 | String操作合集

文章目錄截取特定兩個字符之間的字符串截取特定兩個字符之間的字符串 利用正則表達式&#xff0c;圖片來源

uniapp 刷新后數據都沒有了_環境溫度傳感器都沒有連接,竟然還會有數據?

福田歐曼GTL(福康發動機、康明斯2880系統)匹配ECoffit尿素泵●故障現象&#xff1a;OBD故障燈點亮&#xff0c;不燒尿素&#xff0c;油耗高&#xff0c;動力不足●故障碼&#xff1a;●維修分析&#xff1a;①故障指出加熱器問題&#xff0c;摸下尿素箱溫度&#xff0c;發現燙手…

Android | 再探 RecyclerView 之名詞解析

文章目錄Adapter、ViewHolderchild viewLayoutManagerRecyclerScrapDirtyIndexPositionlayout position 和 adapter position四級緩存瀏覽本文前推薦先閱讀 Android入門&#xff08;九&#xff09;| 滾動控件 ListView 與 RecyclerView Adapter、ViewHolder Adapter: A subcla…

Linux學習:第一章-Linux簡介

一 UNIX發展史1 1965年&#xff0c;美國麻省理工學院&#xff08;MIT&#xff09;、通用電氣公司&#xff08;GE&#xff09;及AT&T的貝爾實驗室聯合開發Multics工程計劃&#xff0c;其目標是開發一種交互式的具有多道程序處理能力的分時操作系統&#xff0c;但因Multics追…