99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

Android Fragment基本概述

2023-03-31 13:46 更新

本節(jié)引言

好的,在上一章中我們把Android的四大組件Activity,Service,BroadCastReceiver,ContentProvider 以及他們之間的紐帶:Intent,都擼了一遍,而本章節(jié)給大家?guī)?lái)的是一個(gè)Fragment(碎片)的東西, 本節(jié)我們就來(lái)介紹這個(gè)Fragment的一些基本概念以及用法! 官方文檔:Fragment


1.基本概念

1)它是什么鬼,有什么用?

答:Fragment是Android3.0后引入的一個(gè)新的API,他出現(xiàn)的初衷是為了適應(yīng)大屏幕的平板電腦, 當(dāng)然現(xiàn)在他仍然是平板APP UI設(shè)計(jì)的寵兒,而且我們普通手機(jī)開(kāi)發(fā)也會(huì)加入這個(gè)Fragment, 我們可以把他看成一個(gè)小型的Activity,又稱Activity片段!想想,如果一個(gè)很大的界面,我們 就一個(gè)布局,寫(xiě)起界面來(lái)會(huì)有多麻煩,而且如果組件多的話是管理起來(lái)也很麻煩!而使用Fragment 我們可以把屏幕劃分成幾塊,然后進(jìn)行分組,進(jìn)行一個(gè)模塊化的管理!從而可以更加方便的在 運(yùn)行過(guò)程中動(dòng)態(tài)地更新Activity的用戶界面!另外Fragment并不能單獨(dú)使用,他需要嵌套在Activity 中使用,盡管他擁有自己的生命周期,但是還是會(huì)受到宿主Activity的生命周期的影響,比如Activity 被destory銷毀了,他也會(huì)跟著銷毀!

下圖是文檔中給出的一個(gè)Fragment分別對(duì)應(yīng)手機(jī)與平板間不同情況的處理圖:

PS:簡(jiǎn)單的新聞瀏覽頁(yè)面,使用兩個(gè)Fragment分別顯示新聞列表與新聞內(nèi)容;


2)Fragment的生命周期圖


3)核心要點(diǎn):

下面說(shuō)下使用Fragment的一些要點(diǎn):

  • 3.0版本后引入,即minSdk要大于11
  • Fragment需要嵌套在Activity中使用,當(dāng)然也可以嵌套到另外一個(gè)Fragment中,但這個(gè)被嵌套 的Fragment也是需要嵌套在Activity中的,間接地說(shuō),Fragment還是需要嵌套在Activity中!! 受寄主Activity的生命周期影響,當(dāng)然他也有自己的生命周期!另外不建議在Fragment里面 嵌套Fragment因?yàn)榍短自诶锩娴腇ragment生命周期不可控!!!
  • 官方文檔說(shuō)創(chuàng)建Fragment時(shí)至少需要實(shí)現(xiàn)三個(gè)方法:onCreate( ),onCreateView( ),OnPause( ); 不過(guò)貌似只寫(xiě)一個(gè)onCreateView也是可以的...
  • Fragment的生命周期和Activity有點(diǎn)類似:三種狀態(tài):
    Resumed:在允許中的Fragment可見(jiàn)
    Paused:所在Activity可見(jiàn),但是得不到焦點(diǎn)
    Stoped: ①調(diào)用addToBackStack(),Fragment被添加到Bcak棧 ②該Activity轉(zhuǎn)向后臺(tái),或者該Fragment被替換/刪除
    ps:停止?fàn)顟B(tài)的fragment仍然活著(所有狀態(tài)和成員信息被系統(tǒng)保持著),然而,它對(duì)用戶 不再可見(jiàn),并且如果activity被干掉,他也會(huì)被干掉.

4)Fragment的幾個(gè)子類:

ps:很多時(shí)候我們都是直接重寫(xiě)Fragment,inflate加載布局完成相應(yīng)業(yè)務(wù)了,子類用的不多,等需要的 時(shí)候在深入研究!

  • 對(duì)話框:DialogFragment
  • 列表:ListFragment
  • 選項(xiàng)設(shè)置:PreferenceFragment
  • WebView界面:WebViewFragment

5)是用App包下的Fragment還是v4包下的:

問(wèn)題概述:

相信很多朋友在使用Fragment的時(shí)候都會(huì)遇到下面這種情況:


那么我們到底是使用android.app下的Fragment還是用的android.support.v4.app包下 的Fragment呢?

答:其實(shí)都可以,前面說(shuō)過(guò)Fragment是Android 3.0(API 11)后引入的,那么如果開(kāi)發(fā)的app需要 在3.0以下的版本運(yùn)行呢?比如還有一點(diǎn)點(diǎn)市場(chǎng)份額的2.3!于是乎,v4包就這樣應(yīng)運(yùn)而生了, 而最低可以兼容到1.6版本!至于使用哪個(gè)包看你的需求了,現(xiàn)在3.0下手機(jī)市場(chǎng)份額其實(shí)已經(jīng)不多了,隨街都是4.0以上的,6.0十月份都出了,你說(shuō)呢...所以這個(gè)時(shí)候,你可以直接使用app包下的Fragment 然后調(diào)用相關(guān)的方法,通常都是不會(huì)有什么問(wèn)題的;如果你Fragment用了app包的, FragmentManager和FragmentTransaction都需要是app包的!要么用全部用app,要么全部用v4, 不然可是會(huì)報(bào)錯(cuò)的哦!當(dāng)然如果你要自己的app對(duì)于低版本的手機(jī)也兼容的話,那么就可以選擇用v4包!

使用v4包下Fragment要注意的地方:

①如果你使用了v4包下的Fragment,那么所在的那個(gè)Activity就要繼承FragmentActivity哦! 案例:今天在xml文件中靜態(tài)地載入fragment,然后重寫(xiě)了Fragment,但是在加載Activity的時(shí)候就報(bào)錯(cuò)了, 大概的提示就是Fragment錯(cuò)誤還是找不到什么的,name屬性改了幾次還是錯(cuò)!最后才發(fā)現(xiàn)是用了 v4的包的緣故,只需讓自己的Activity改成FragmentActivity即可!②之前寫(xiě)了下面這段代碼,然后報(bào)錯(cuò):有點(diǎn)莫名其妙啊,Fragment,FragmentManager,FragmentTransaction都是用的v4包啊, Activity也是繼承FragmentActivity的啊?都改成app包就可以了,但是這不和我們用v4包的 前提沖突了么?其實(shí)也是有解決方法的哈?答:只需要把getFragmentManager( )改成getSupportFragmentManager( )就可以了

2.創(chuàng)建一個(gè)Fragment

1)靜態(tài)加載Fragment

實(shí)現(xiàn)流程:

5.png

示例代碼:

Step 1:定義Fragment的布局,就是fragment顯示內(nèi)容的

Step 2:自定義一個(gè)Fragment類,需要繼承Fragment或者他的子類,重寫(xiě)onCreateView()方法 在該方法中調(diào)用:inflater.inflate()方法加載Fragment的布局文件,接著返回加載的view對(duì)象

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對(duì)應(yīng)的布局文件中添加fragment的標(biāo)簽, 記住,name屬性是全限定類名哦,就是要包含F(xiàn)ragment的包名,如:

<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( )方法中調(diào)用setContentView()加載布局文件即可!

2)動(dòng)態(tài)加載Fragment

實(shí)現(xiàn)流程:

7.png

示例代碼:這里演示的是,當(dāng)橫豎屏切換的時(shí)候地切換Fragment:

6.gif

Fragment以及布局代碼就不貼出來(lái)了,直接貼MainActivity的關(guān)鍵代碼:

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事務(wù)

8.png

4.Fragment與Activity的交互

9.png

可能有的朋友不喜歡看圖,接下來(lái)用文字介紹下吧:

1)組件獲取

Fragment獲得Activity中的組件: getActivity().findViewById(R.id.list);Activity獲得Fragment中的組件(根據(jù)id和tag都可以):getFragmentManager.findFragmentByid(R.id.fragment1);

2)數(shù)據(jù)傳遞

①Activit傳遞數(shù)據(jù)給Fragment:

在Activity中創(chuàng)建Bundle數(shù)據(jù)包,調(diào)用Fragment實(shí)例的setArguments(bundle) 從而將Bundle數(shù)據(jù)包傳給Fragment,然后Fragment中調(diào)用getArguments獲得 Bundle對(duì)象,然后進(jìn)行解析就可以了

②Fragment傳遞數(shù)據(jù)給Activity

在Fragment中定義一個(gè)內(nèi)部回調(diào)接口,再讓包含該Fragment的Activity實(shí)現(xiàn)該回調(diào)接口, Fragment就可以通過(guò)回調(diào)接口傳數(shù)據(jù)了,回調(diào),相信很多人都知道是什么玩意,但是 寫(xiě)不出來(lái)啊,網(wǎng)上的一百度"fragment傳數(shù)據(jù)給Activity",全是李剛老師的那個(gè)代碼,真心無(wú)語(yǔ) 算了,這里就寫(xiě)下局部代碼吧,相信讀者一看就懂的了:

Step 1:定義一個(gè)回調(diào)接口:(Fragment中)

/*接口*/  
public interface CallBack{  
    /*定義一個(gè)獲取信息的方法*/  
    public void getResult(String result);  
}
Step 2:接口回調(diào)(Fragment中)

/*接口回調(diào)*/  
public void getData(CallBack callBack){  
    /*獲取文本框的信息,當(dāng)然你也可以傳其他類型的參數(shù),看需求咯*/  
    String msg = editText.getText().toString();  
    callBack.getResult(msg);  
}

Step 3:使用接口回調(diào)方法讀數(shù)據(jù)(Activity中)

/* 使用接口回調(diào)的方法獲取數(shù)據(jù) */  
leftFragment.getData(new CallBack() {  
 @Override  
       public void getResult(String result) {              /*打印信息*/  
            Toast.makeText(MainActivity.this, "-->>" + result, 1).show();  
            }
        });

總結(jié)下方法:->在Fragment定義一個(gè)接口,接口中定義抽象方法,你要傳什么類型的數(shù)據(jù)參數(shù)就設(shè)置為什么類型;->接著還有寫(xiě)一個(gè)調(diào)用接口中的抽象方法,把要傳遞的數(shù)據(jù)傳過(guò)去->再接著就是Activity了,調(diào)用Fragment提供的那個(gè)方法,然后重寫(xiě)抽象方法的時(shí)候進(jìn)行數(shù)據(jù) 的讀取就可以了!!!

③Fragment與Fragment之間的數(shù)據(jù)互傳

其實(shí)這很簡(jiǎn)單,找到要接受數(shù)據(jù)的fragment對(duì)象,直接調(diào)用setArguments傳數(shù)據(jù)進(jìn)去就可以了 通常的話是replace時(shí),即fragment跳轉(zhuǎn)的時(shí)候傳數(shù)據(jù)的,那么只需要在初始化要跳轉(zhuǎn)的Fragment 后調(diào)用他的setArguments方法傳入數(shù)據(jù)即可!如果是兩個(gè)Fragment需要即時(shí)傳數(shù)據(jù),而非跳轉(zhuǎn)的話,就需要先在Activity獲得f1傳過(guò)來(lái)的數(shù)據(jù), 再傳到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.走一次生命周期圖:

思前想后還是決定要帶大家簡(jiǎn)單的走一趟生命周期圖,加深大家對(duì)Fragment生命周期的理解:

①Activity加載Fragment的時(shí)候,依次調(diào)用下面的方法:onAttach ->  onCreate -> onCreateView -> onActivityCreated -> onStart ->onResume②當(dāng)我們弄出一個(gè)懸浮的對(duì)話框風(fēng)格的Activity,或者其他,就是讓Fragment所在的Activity可見(jiàn),但不獲得焦點(diǎn)onPause③當(dāng)對(duì)話框關(guān)閉,Activity又獲得了焦點(diǎn):onResume④當(dāng)我們替換Fragment,并調(diào)用addToBackStack()將他添加到Back棧中onPause -> onStop -> onDestoryView?。∽⒁?此時(shí)的Fragment還沒(méi)有被銷毀哦!!!⑤當(dāng)我們按下鍵盤的回退鍵,F(xiàn)ragment會(huì)再次顯示出來(lái):onCreateView -> onActivityCreated -> onStart -> onResume⑥如果我們替換后,在事務(wù)commit之前沒(méi)有調(diào)用addToBackStack()方法將 Fragment添加到back棧中的話;又或者退出了Activity的話,那么Fragment將會(huì)被完全結(jié)束, Fragment會(huì)進(jìn)入銷毀狀態(tài)onPause -> onStop -> onDestoryView -> onDestory -> onDetach

本節(jié)小結(jié):

本節(jié)跟大家講解了以下Fragment一些基本的概念以及簡(jiǎn)單的用法,相信大家會(huì)慢慢喜歡上 Fragment的,因?yàn)槠年P(guān)系,本節(jié)就寫(xiě)這么多,下一節(jié)我們帶大家來(lái)寫(xiě)一些關(guān)于Fragment 的常用實(shí)例,敬請(qǐng)期待,謝謝~


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)