Android Fragment完全解析,關于碎片你所需知道的一切

  我們都知道,Android上的界面展示都是通過Activity實現的,Activity實在是太常用了,我相信大家都已經非常熟悉了,這里就不再贅述。

  但是Activity也有它的局限性,同樣的界面在手機上顯示可能很好看,在平板上就未必了,因為平板的屏幕非常大,手機的界面放在平板上可能會有過分被拉長、控件間距過大等情況。這個時候更好的體驗效果是在Activity中嵌入”小Activity”,然后每個”小Activity”又可以擁有自己的布局。因此,我們今天的主角Fragment登場了。

Fragment初探
  為了讓界面可以在平板上更好的展示,Android在3.0版本引入了Fragment(碎片)功能,它非常類似于Activity,可以像Activity一樣包含布局。Fragment通常是嵌套在Activity中使用的,現在想象這種場景:有兩個Fragment,Fragment 1包含了一個ListView,每行顯示一本書的標題。Fragment 2包含了TextView和ImageView,來顯示書的詳細內容和圖片。
   如果現在程序運行豎屏模式的平板或手機上,Fragment1可能嵌入在一個Activity鐘,而Fragment2可能嵌入在另一個Activity中,如下圖所示
   這里寫圖片描述
   而如果現在程序運行在橫屏模式的平板上,兩個Fragment就可以嵌入在同一個Activity中了,如下圖所示:
這里寫圖片描述
  由此可以看出,使用Fragment可以讓我們更加充分地利用平板的屏幕空間,下面我們一起來探究下如何使用Fragment。
  新建一個項目叫做Fragments,然后在layout文件夾下新建一個名為fragment1.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:background="#00ff00"><TextView
        android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="This is fragment 1"android:textColor="#000000"android:textSize="25sp"/>
</LinearLayout>

fragment2.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:background="#ffff00"><TextView
        android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="This is fragment 2"android:textColor="#000000"android:textSize="25sp"/>
</LinearLayout>

然后新建一個類Fragment1,這個類是繼承自Fragment的:

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

我們可以看到,這個類也非常簡單,主要就是加載了我們剛剛寫好的fragment1.xml布局文件并返回。同樣的方法,我們再寫好Fragment2 :

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

然后打開或新建activity_main.xml作為主Activity的布局文件,在里面加入兩個Fragment的引用,使用android:name前綴來引用具體的Fragment:

<?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:background="#00ff00"><fragment
        android:id="@+id/fragment1"android:name="com.example.wu.myapplication.Fragment1"android:layout_width="0dip"android:layout_height="match_parent"android:layout_weight="1"/><fragment
        android:id="@+id/fragment2"android:name="com.example.wu.myapplication.Fragment2"android:layout_width="0dip"android:layout_height="match_parent"android:layout_weight="1"/></LinearLayout>

最后打開或新建MainActivity作為程序的主Activity,里面的代碼非常簡單,都是自動生成的:

public class MainActivity extends AppCompatActivity {@Overridepublic void onCreate( Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}
}

現在我們來運行一次程序,就會看到,一個Activity很融洽地包含了兩個Fragment,這兩個Fragment平分了整個屏幕,效果圖如下:
這里寫圖片描述

動態添加Fragment
  你已經學會了如何在XML中使用Fragment,但是這僅僅是Fragment最簡單的功能而已。Fragment真正的強大之處在于可以動態地添加到Activity當中,因此這也是你必須要掌握的東西。當你學會了在程序運行時向Activity添加Fragment,程序的界面就可以定制的更加多樣化。下面我們立刻來看看,如何動態添加Fragment。
  還是在上一節代碼的基礎上修改,打開activity_main.xml,將其中對Fragment的引用都刪除,只保留最外層的LinearLayout,并給它添加一個id,因為我們要動態添加Fragment,不用在XML里添加了,刪除后代碼如下:  

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/main_layout"android:layout_width="match_parent"android:layout_height="match_parent"android:baselineAligned="false">
</LinearLayout>

然后打開MainActivity,修改其中的代碼如下所示:

public class MainActivity extends AppCompatActivity {@Overridepublic void onCreate( Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Display display=getWindowManager().getDefaultDisplay();if (display.getWidth()>display.getHeight()){Fragment1 fragment1=new Fragment1();getFragmentManager().beginTransaction().replace(R.id.main_layout,fragment1).commit();}else {Fragment2 fragment2=new Fragment2();getFragmentManager().beginTransaction().replace(R.id.main_layout,fragment2).commit();}}
}

  首先,我們要獲取屏幕的寬度和高度,然后進行判斷,如果屏幕寬度大于高度就添加fragment1,如果高度大于寬度就添加fragment2。動態添加Fragment主要分為4步:

  1.獲取到FragmentManager,在Activity中可以直接通過 getFragmentManager得到。
  2.開啟一個事務,通過調用beginTransaction方法開啟。
  3.向容器內加入Fragment,一般使用replace方法實現,需要傳入容器的id和Fragment的實例。
  4.提交事務,調用commit方法提交。

  現在運行一下程序,效果如下圖所示:
這里寫圖片描述
這里寫圖片描述

Fragment的生命周期
和Activity一樣,Fragment也有自己的生命周期,理解Fragment的生命周期非常重要,我們通過代碼的方式來瞧一瞧Fragment的生命周期是什么樣的:

public class Fragment1 extends Fragment {  public static final String TAG = "Fragment1";  @Override  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  Log.d(TAG, "onCreateView");  return inflater.inflate(R.layout.fragment1, container, false);  }  @Override  public void onAttach(Activity activity) {  super.onAttach(activity);  Log.d(TAG, "onAttach");  }  @Override  public void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  Log.d(TAG, "onCreate");  }  @Override  public void onActivityCreated(Bundle savedInstanceState) {  super.onActivityCreated(savedInstanceState);  Log.d(TAG, "onActivityCreated");  }  @Override  public void onStart() {  super.onStart();  Log.d(TAG, "onStart");  }  @Override  public void onResume() {  super.onResume();  Log.d(TAG, "onResume");  }  @Override  public void onPause() {  super.onPause();  Log.d(TAG, "onPause");  }  @Override  public void onStop() {  super.onStop();  Log.d(TAG, "onStop");  }  @Override  public void onDestroyView() {  super.onDestroyView();  Log.d(TAG, "onDestroyView");  }  @Override  public void onDestroy() {  super.onDestroy();  Log.d(TAG, "onDestroy");  }  @Override  public void onDetach() {  super.onDetach();  Log.d(TAG, "onDetach");  }  }  

可以看到,上面的代碼在每個生命周期的方法里都打印了日志,然后我們來運行一下程序,可以看到打印日志如下:
這里寫圖片描述
這時點擊一下home鍵,打印日志如下:
這里寫圖片描述
如果你再重新進入進入程序,打印日志如下:
這里寫圖片描述
然后點擊back鍵退出程序,打印日志如下:
這里寫圖片描述

看到這里,我相信大多數朋友已經非常明白了,因為這和Activity的生命周期太相似了。只是有幾個Activity中沒有的新方法,這里需要重點介紹一下:
onAttach方法:Fragment和Activity建立關聯的時候調用。
onCreateView方法:為Fragment加載布局時調用。
onActivityCreated方法:當Activity中的onCreate方法執行完后調用。
onDestroyView方法:Fragment中的布局被移除時調用。
onDetach方法:Fragment和Activity解除關聯的時候調用。

Fragment之間進行通信
通常情況下,Activity都會包含多個Fragment,這時多個Fragment之間如何進行通信就是個非常重要的問題了。我們通過一個例子來看一下,如何在一個Fragment中去訪問另一個Fragment的視圖。

還是在第一節代碼的基礎上修改,首先打開fragment2.xml,在這個布局里面添加一個按鈕:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:orientation="vertical"  android:background="#ffff00" >  <TextView  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:text="This is fragment 2"  android:textColor="#000000"  android:textSize="25sp" />  <Button   android:id="@+id/button"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:text="Get fragment1 text"  />  </LinearLayout>  

然后打開fragment1.xml,為TextView添加一個id:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:background="#00ff00" >  <TextView  android:id="@+id/fragment1_text"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:text="This is fragment 1"  android:textColor="#000000"  android:textSize="25sp" />  </LinearLayout>  

接著打開Fragment2.java,添加onActivityCreated方法,并處理按鈕的點擊事件:

public class Fragment2 extends Fragment {  @Override  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  return inflater.inflate(R.layout.fragment2, container, false);  }  @Override  public void onActivityCreated(Bundle savedInstanceState) {  super.onActivityCreated(savedInstanceState);  Button button = (Button) getActivity().findViewById(R.id.button);  button.setOnClickListener(new OnClickListener() {  @Override  public void onClick(View v) {  TextView textView = (TextView) getActivity().findViewById(R.id.fragment1_text);  Toast.makeText(getActivity(), textView.getText(), Toast.LENGTH_LONG).show();  }  });  }  }  

這里寫圖片描述
我們可以看到,在fragment2中成功獲取到了fragment1中的視圖,并彈出Toast。這是怎么實現的呢?主要都是通過getActivity這個方法實現的。getActivity方法可以讓Fragment獲取到關聯的Activity,然后再調用Activity的findViewById方法,就可以獲取到和這個Activity關聯的其它Fragment的視圖了。

轉自:http://blog.csdn.net/guolin_blog/article/details/8881711

轉載于:https://www.cnblogs.com/Mayny/p/9374192.html

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

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

相關文章

圖像--攝像頭組成與基本參數

基本組成 Sensor: 圖象傳感器 FPC: 電路板 IR:紅外濾波片 Holder:基座 Lens:鏡頭 其他 核心部件&#xff1a;1- SENSOR 2- LENS Sensor參數 類別 指標 參考 備注 Sensor 廠家 sony 三星 OV 格科微由原廠提供完整規格書和型號 低像素需要注意 分辨率 0.3MP (VGA)模組…

1.I2C協議

1.I2C協議2條雙向串行線&#xff0c;一條數據線SDA&#xff0c;一條時鐘線SCL。SDA傳輸數據是大端傳輸&#xff0c;每次傳輸8bit&#xff0c;即一字節。支持多主控(multimastering)&#xff0c;任何時間點只能有一個主控。總線上每個設備都有自己的一個addr&#xff0c;共7個bi…

聯想啟天M715E安裝硬盤保護系統和網絡同傳

現還是學生&#xff0c;雖然大四課上的少&#xff0c;實驗室去的也不勤了&#xff0c;但指導老師有事吩咐&#xff0c;還是要辦好的。 沈老師榮升軟件實驗室主任&#xff0c;學校給了2個機房&#xff0c;一個70臺聯想啟天M715E&#xff0c;一個30臺新的70臺新主機&#xff08;配…

圖像--攝像頭數據輸出格式與傳輸接口

一、 數據輸出格式 RAW data 格式: CMOS 在將光信號轉換為電信號時的電平高低的原始記錄&#xff0c;單純地將沒有進行任何處理的圖像數據&#xff0c;即攝像元件直接得到的電信號進行數字化處理而得到的。 每個pixel只能感光R光或者B光或者G光&am…

計算機入門與學習回憶(一)

這個回憶&#xff0c;不是記錄什么成功&#xff0c;而記錄一些失敗的經歷。 大約初中還是高中的時候&#xff0c;就玩過計算機。那是一個很冷的冬天的晚上&#xff0c;一臺華南計算機所造的仿APPLE II的計算機。 這臺計算機很簡陋&#xff0c;只有一個主機&#xff0c;沒有屏幕…

怎么建立微信生態用戶增長模型?

微信最新數據及中國網民最新數據概述截止到2018年&#xff0c;移動網民用戶增長放緩&#xff0c;接近人口大盤。微信作為全國移動網民的一款超級應用&#xff0c;在移動網民的***率超過90%。微信最近一年的新增用戶主要來自中老年用戶群體和鄉鎮用戶群體***。易觀最新發布的8月…

數據庫設計的三大范式

三大范式是為了了更好的設計數據庫 1. 所謂第一范式&#xff08;1NF&#xff09;是指在關系模型中&#xff0c;對列添加的一個規范要求&#xff0c;所有的列都應該是原子性的&#xff0c;即數據庫表的每一列都是不可分割的原子數據項&#xff0c;而不能是集合&#xff0c;數組&…

圖像-攝像頭驅動流程

驅動架構 在Kernel層用camera的驅動將其驅動起來以后&#xff0c;將硬件驅動接口交給Hal&#xff1b; 上層的camera應用程序在andriod實時系統的虛擬機中&#xff0c;加載留給camera公用的庫文 件&#xff0c;調用Hal層的接口來控制camera硬件來實現功能。 驅動流程 打開came…

第四章

選擇結構&#xff08;二&#xff09; 學習本章會用到的單詞&#xff1a; case&#xff1a;實例&#xff0c;情形&#xff0c;情況 switch&#xff1a;轉換&#xff0c;切換&#xff0c;開關 default&#xff1a;系統默認值&#xff0c;違約&#xff0c;預設。缺省 exit&#xf…

tensorflow的一些函數

1.tf.constant(value,dtypeNone,shapeNone,nameConst) 注意這個函數創造的是一個常數tensor&#xff0c;而不是一個具體的常數 value:即可以是list&#xff0c;也可以是value dtype:對應生成的tensor里的元素的類型 # Constant 1-D Tensor populated with value list.tensor t…

生活小常識

1、面試時說三個月試用期可以縮短的不要相信&#xff0c;可以談談別的條件 2、在飯店吃飯滿幾桌送下次吃飯的卷的不要信。可能你會沒時間&#xff0c;或飯店沒地方。&#xff08;談談當時可以送的其他優惠。或者根據自己的需求定桌數&#xff0c;不要被他誘惑湊桌&#xff09;轉…

IP、TCP、UDP數據包長度問題

IP數據包長度問題總結 首先要看TCP/IP協議&#xff0c;涉及到四層&#xff1a;鏈路層&#xff0c;網絡層&#xff0c;傳輸層&#xff0c;應用層。   其中以太網&#xff08;Ethernet&#xff09;的數據幀在鏈路層    IP包在網絡層   TCP或UDP包在傳輸層    TCP或UDP中的…

RK瑞芯微WIFI模組2020最新支持列表,放心使用!

如下所示為RK瑞芯微2020最新支持的WIFIBT模組列表&#xff0c;請參考&#xff01; 標題希望對選型有所幫助&#xff0c;避免踩坑&#xff0c;坑驅動工程師&#xff01; 有事要搞&#xff0c;請私聊&#xff01;

數據類型進階

----------siwuxie095 1、整數類型 如果去掉注釋&#xff0c;報錯&#xff1a;Type mismatch: cannot convert from into byte 即 不能把 int 類型轉換成 byte 類型 如果選擇 Add cast to byte&#xff1a; 即 把 b13 的結果&#xff08;默認為 int 類型&#xff09;強制轉換成…

區塊鏈教程Fabric1.0源代碼分析流言算法Gossip服務端二

區塊鏈教程Fabric1.0源代碼分析流言算法Gossip服務端二 Fabric 1.0源代碼筆記 之 gossip&#xff08;流言算法&#xff09; #GossipServer&#xff08;Gossip服務端&#xff09; 5.2、commImpl結構體方法 //conn.serviceConnection()&#xff0c;啟動連接服務 func (c *commImp…

一段H264數據的分析

&#xfeff;&#xfeff;目錄(?)[-] 分析00 00 00 01 67 42 00 1E 99 A0 B1 31 00 00 00 01分析00 00 00 01 68 CE 38 80 00 00 00 01 分析00 00 00 01 67 42 00 1E 99 A0 B1 31 00 00 00 01 H264的數據流分為兩種&#xff0c;一種是NAL UNIT stream(RTP),一種是 bits stream…

海華模組:WIFI、BT、SoC模組列表

各種模塊廣泛應用于網絡攝像頭、智能機器人、兒童故事機、詞典筆、智能音箱、智能家電等需要實現無線聯網設備的消費類電子產品。 模塊化有很大的有點&#xff1a;集成設計、減少調試工作&#xff0c;避開開發盲區、加速將產品推向市場&#xff01; 下面介紹下海華各類通訊模…

JAVA-初步認識-第七章-構造函數和一般函數的區別

一. 構造函數是對象一創建&#xff0c;就被調用了。(調用這個詞很特殊&#xff0c;是涉及到實體時&#xff0c;才會有調用的過程) 還有一點想說的是&#xff0c;構造函數的聲明應該是固定的&#xff0c;不然沒法隨著對象的創建一起執行&#xff0c;必須是類名括號的形式。 二. …

深入理解哈希表

轉自&#xff1a;https://bestswifter.com/hashtable/ 這篇文章由一個簡單的問題引出: 有兩個字典&#xff0c;分別存有 100 條數據和 10000 條數據&#xff0c;如果用一個不存在的 key 去查找數據&#xff0c;在哪個字典中速度更快&#xff1f; 有些計算機常識的讀者都會立刻回…

Linux服務器ftp+httpd部署

一、ftp安裝 1、安裝vsftpd 命令&#xff1a;yum -y install vsftpd 2、修改ftp配置文件 命令&#xff1a;vim /etc/vsftpd/vsftpd.conf 3、按i進入insert模式后&#xff0c;按以下要求修改 anonymous_enableYES 改為anonymous_enableNO chroot_local_userYES #去掉前面的注釋 …