<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 5.1 Fragment基本概述 ## 本節引言 > 好的,在上一章中我們把Android的四大組件Activity,Service,BroadCastReceiver,ContentProvider 以及他們之間的紐帶:Intent,都擼了一遍,而本章節給大家帶來的是一個Fragment(碎片)的東西, 本節我們就來介紹這個Fragment的一些基本概念以及用法! 官方文檔:[Fragment](http://developer.android.com/guide/components/fragments.html) ## 1.基本概念 ### 1)它是什么鬼,有什么用? > 答:Fragment是Android3.0后引入的一個新的API,他出現的初衷是為了適應大屏幕的平板電腦, 當然現在他仍然是平板APP UI設計的寵兒,而且我們普通手機開發也會加入這個Fragment, 我們可以把他看成一個小型的Activity,又稱Activity片段!想想,如果一個很大的界面,我們 就一個布局,寫起界面來會有多麻煩,而且如果組件多的話是管理起來也很麻煩!而使用Fragment 我們可以把屏幕劃分成幾塊,然后進行分組,進行一個模塊化的管理!從而可以更加方便的在 運行過程中動態地更新Activity的用戶界面!另外Fragment并不能單獨使用,他需要嵌套在Activity 中使用,盡管他擁有自己的生命周期,但是還是會受到宿主Activity的生命周期的影響,比如Activity 被destory銷毀了,他也會跟著銷毀! 下圖是文檔中給出的一個Fragment分別對應手機與平板間不同情況的處理圖: ![](http://www.runoob.com/wp-content/uploads/2015/08/41442282.jpg) PS:簡單的新聞瀏覽頁面,使用兩個Fragment分別顯示新聞列表與新聞內容; ### 2)Fragment的生命周期圖 ![](http://www.runoob.com/wp-content/uploads/2015/08/31722863.jpg) ### 3)核心要點: 下面說下使用Fragment的一些要點: > * 3.0版本后引入,即minSdk要大于11 > * Fragment需要嵌套在Activity中使用,當然也可以嵌套到另外一個Fragment中,但這個被嵌套 的Fragment也是需要嵌套在Activity中的,間接地說,Fragment還是需要嵌套在Activity中!! 受寄主Activity的生命周期影響,當然他也有自己的生命周期!另外不建議在Fragment里面 嵌套Fragment因為嵌套在里面的Fragment生命周期不可控!!! > * 官方文檔說創建Fragment時至少需要實現三個方法:onCreate( ),onCreateView( ),OnPause( ); 不過貌似只寫一個onCreateView也是可以的... > * Fragment的生命周期和Activity有點類似:三種狀態: > Resumed:在允許中的Fragment可見 > Paused:所在Activity可見,但是得不到焦點 > Stoped: ①調用addToBackStack(),Fragment被添加到Bcak棧 ②該Activity轉向后臺,或者該Fragment被替換/刪除 > ps:停止狀態的fragment仍然活著(所有狀態和成員信息被系統保持著),然而,它對用戶 不再可見,并且如果activity被干掉,他也會被干掉. ### 4)Fragment的幾個子類: ps:很多時候我們都是直接重寫Fragment,inflate加載布局完成相應業務了,子類用的不多,等需要的 時候在深入研究! > * 對話框:**DialogFragment** > * 列表:**ListFragment** > * 選項設置:**PreferenceFragment** > * WebView界面:**WebViewFragment** ### 5)是用App包下的Fragment還是v4包下的: **問題概述:** 相信很多朋友在使用Fragment的時候都會遇到下面這種情況: ![](http://www.runoob.com/wp-content/uploads/2015/08/85759370.jpg) 那么我們到底是使用android.app下的Fragment還是用的android.support.v4.app包下 的Fragment呢? > 答:其實都可以,前面說過Fragment是Android 3.0(API 11)后引入的,那么如果開發的app需要 在3.0以下的版本運行呢?比如還有一點點市場份額的2.3!于是乎,v4包就這樣應運而生了, 而最低可以兼容到1.6版本!至于使用哪個包看你的需求了,現在3.0下手機市場份額其實已經不多了,隨街都是4.0以上的,6.0十月份都出了,你說呢...所以這個時候,你可以直接使用app包下的Fragment 然后調用相關的方法,通常都是不會有什么問題的;如果你Fragment用了app包的, FragmentManager和FragmentTransaction都需要是app包的!要么用全部用app,要么全部用v4, 不然可是會報錯的哦!當然如果你要自己的app對于低版本的手機也兼容的話,那么就可以選擇用v4包! **使用v4包下Fragment要注意的地方:** > * ①如果你使用了v4包下的Fragment,那么所在的那個Activity就要繼承FragmentActivity哦! 案例:今天在xml文件中靜態地載入fragment,然后重寫了Fragment,但是在加載Activity的時候就報錯了, 大概的提示就是Fragment錯誤還是找不到什么的,name屬性改了幾次還是錯!最后才發現是用了 v4的包的緣故,只需讓自己的Activity改成FragmentActivity即可! > * ②之前寫了下面這段代碼,然后報錯: ![](http://www.runoob.com/wp-content/uploads/2015/08/42421258.jpg) 有點莫名其妙啊,Fragment,FragmentManager,FragmentTransaction都是用的v4包啊, Activity也是繼承FragmentActivity的啊?都改成app包就可以了,但是這不和我們用v4包的 前提沖突了么?其實也是有解決方法的哈? > 答:只需要把**getFragmentManager**( )改成**getSupportFragmentManager**( )就可以了 ## 2.創建一個Fragment ### 1)靜態加載Fragment **實現流程:** ![](http://www.runoob.com/wp-content/uploads/2015/08/14443487.jpg) **示例代碼:** **Step 1:**定義Fragment的布局,就是fragment顯示內容的 **Step 2:**自定義一個Fragment類,需要繼承Fragment或者他的子類,重寫onCreateView()方法 在該方法中調用:inflater.inflate()方法加載Fragment的布局文件,接著返回加載的view對象 ``` public class Fragmentone extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment1, container,false); return view; } } ``` **Step 3:**在需要加載Fragment的Activity對應的布局文件中添加fragment的標簽, 記住,name屬性是全限定類名哦,就是要包含Fragment的包名,如: ``` <fragment android:id="@+id/fragment1" android:name="com.jay.example.fragmentdemo.Fragmentone" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> ``` **Step 4:** Activity在onCreate( )方法中調用setContentView()加載布局文件即可! ### 2)動態加載Fragment **實現流程:** ![](http://www.runoob.com/wp-content/uploads/2015/08/29546434.jpg) **示例代碼:** 這里演示的是,當橫豎屏切換的時候地切換Fragment: ![](http://www.runoob.com/wp-content/uploads/2015/08/23304886.jpg) Fragment以及布局代碼就不貼出來了,直接貼MainActivity的關鍵代碼: ``` public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Display dis = getWindowManager().getDefaultDisplay(); if(dis.getWidth() > dis.getHeight()) { Fragment1 f1 = new Fragment1(); getFragmentManager().beginTransaction().replace(R.id.LinearLayout1, f1).commit(); } else { Fragment2 f2 = new Fragment2(); getFragmentManager().beginTransaction().replace(R.id.LinearLayout1, f2).commit(); } } } ``` ## 3.Fragment管理與Fragment事務 ![](http://www.runoob.com/wp-content/uploads/2015/08/97188171.jpg) ## 4.Fragment與Activity的交互 ![](http://www.runoob.com/wp-content/uploads/2015/08/45971686.jpg) 可能有的朋友不喜歡看圖,接下來用文字介紹下吧: ### 1)組件獲取 Fragment獲得Activity中的組件: **getActivity().findViewById(R.id.list);** Activity獲得Fragment中的組件(根據id和tag都可以):**getFragmentManager.findFragmentByid(R.id.fragment1);** ### 2)數據傳遞 **①Activit傳遞數據給Fragment:** > 在Activity中創建Bundle數據包,調用Fragment實例的setArguments(bundle) 從而將Bundle數據包傳給Fragment,然后Fragment中調用getArguments獲得 Bundle對象,然后進行解析就可以了 **②Fragment傳遞數據給Activity** > 在Fragment中定義一個內部回調接口,再讓包含該Fragment的Activity實現該回調接口, Fragment就可以通過回調接口傳數據了,回調,相信很多人都知道是什么玩意,但是 寫不出來啊,網上的一百度"fragment傳數據給Activity",全是李剛老師的那個代碼,真心無語 算了,這里就寫下局部代碼吧,相信讀者一看就懂的了: **Step 1:定義一個回調接口:(Fragment中)** ``` /*接口*/ public interface CallBack{ /*定義一個獲取信息的方法*/ public void getResult(String result); } ``` **Step 2:接口回調(Fragment中)** ``` /*接口回調*/ public void getData(CallBack callBack){ /*獲取文本框的信息,當然你也可以傳其他類型的參數,看需求咯*/ String msg = editText.getText().toString(); callBack.getResult(msg); } ``` **Step 3:使用接口回調方法讀數據(Activity中)** ``` /* 使用接口回調的方法獲取數據 */ leftFragment.getData(new CallBack() { @Override public void getResult(String result) { /*打印信息*/ Toast.makeText(MainActivity.this, "-->>" + result, 1).show(); } }); ``` **總結下方法:** **-&gt;**在Fragment定義一個接口,接口中定義抽象方法,你要傳什么類型的數據參數就設置為什么類型; **-&gt;**接著還有寫一個調用接口中的抽象方法,把要傳遞的數據傳過去 **-&gt;**再接著就是Activity了,調用Fragment提供的那個方法,然后重寫抽象方法的時候進行數據 的讀取就可以了!!! **③Fragment與Fragment之間的數據互傳** > 其實這很簡單,找到要接受數據的fragment對象,直接調用setArguments傳數據進去就可以了 通常的話是replace時,即fragment跳轉的時候傳數據的,那么只需要在初始化要跳轉的Fragment 后調用他的setArguments方法傳入數據即可! > 如果是兩個Fragment需要即時傳數據,而非跳轉的話,就需要先在Activity獲得f1傳過來的數據, 再傳到f2了,就是以Activity為媒介~ **示例代碼如下:** ``` FragmentManager fManager = getSupportFragmentManager( ); FragmentTransaction fTransaction = fManager.beginTransaction(); Fragmentthree t1 = new Fragmentthree(); Fragmenttwo t2 = new Fragmenttwo(); Bundle bundle = new Bundle(); bundle.putString("key",id); t2.setArguments(bundle); fTransaction.add(R.id.fragmentRoot, t2, "~~~"); fTransaction.addToBackStack(t1); fTransaction.commit(); ``` ## 5.走一次生命周期圖: 思前想后還是決定要帶大家簡單的走一趟生命周期圖,加深大家對Fragment生命周期的理解: > ①Activity加載Fragment的時候,依次調用下面的方法: **onAttach** -&gt; **onCreate** -&gt; **onCreateView** -&gt; **onActivityCreated** -&gt; **onStart** -&gt;**onResume** > > ②當我們弄出一個懸浮的對話框風格的Activity,或者其他,就是讓Fragment所在的Activity可見,但不獲得焦點 **onPause** > > ③當對話框關閉,Activity又獲得了焦點: **onResume** > > ④當我們替換Fragment,并調用addToBackStack()將他添加到Back棧中 **onPause -&gt; onStop -&gt; onDestoryView** !!**注意**,此時的Fragment還沒有被銷毀哦!!! > > ⑤當我們按下鍵盤的回退鍵,Fragment會再次顯示出來: **onCreateView -&gt; onActivityCreated -&gt; onStart -&gt; onResume** > > ⑥如果我們替換后,在事務commit之前**沒有調用addToBackStack()**方法將 Fragment添加到back棧中的話;又或者退出了Activity的話,那么Fragment將會被完全結束, Fragment會進入銷毀狀態 **onPause** -&gt; **onStop** -&gt; **onDestoryView** -&gt; **onDestory** -&gt; **onDetach** ## 本節小結: > 本節跟大家講解了以下Fragment一些基本的概念以及簡單的用法,相信大家會慢慢喜歡上 Fragment的,因為篇幅的關系,本節就寫這么多,下一節我們帶大家來寫一些關于Fragment 的常用實例,敬請期待,謝謝~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看