Fragment的使用方法

簡述Fragment

什么是Fragment
fragment 在英語中是碎片的意思感猛,他是基于activity的一種控件达箍。一個fragment對應(yīng)著它自己的.xml布局文件來描述它的布局和.java文件來繼承Fragment這個類没龙。因為fragment基于activity且可以動態(tài)加載的緣故,它常被用來設(shè)計一些需要在一個activity內(nèi)實現(xiàn)頁面內(nèi)切的app,比如

頁面內(nèi)切.png

平板設(shè)備的一般布局.png

或者一些為大屏幕設(shè)備如平板等打造的app,比如QQ HD


QQ HD

在這些布局中缎玫,用一個Activity承載了很多個動態(tài)的Fragment硬纤,可增可減,這樣做碘梢,即減少了activity的負擔(dān)咬摇,又更加能夠體現(xiàn)MVC設(shè)計框架中View層的靈活性,讓程序的界面設(shè)計更加模塊化煞躬,易于開發(fā)和維護肛鹏。
Frgment的生命周期(Lifecycle)
Android官方API文檔中很詳細的講解了Fragment的生命周期,點擊標題鏈接便可以訪問恩沛。在此簡述如下:

Lifecycle

可以看到Fragment比Activity多了幾個額外的生命周期回調(diào)函數(shù):

onAttach(Activity);//當Activity與Fragment發(fā)生關(guān)聯(lián)時調(diào)用
onCreateView(LayoutInflater,ViewGroup,Bundle);//創(chuàng)建該Fragment的視圖
onActivityCreate(bundle);//當Activity的onCreate()在扰;方法返回時調(diào)用
onDestoryView();//與onCreateView相對應(yīng),當改Fragment被移除時調(diào)用
onDetach();//與onAttach()相對應(yīng)雷客,當Fragment與Activity的關(guān)聯(lián)被取消時調(diào)用
注意:除了onCreateView芒珠,其他的所有方法如果你重寫了,必須調(diào)用父類對于該方法的實現(xiàn)搅裙。

創(chuàng)建Fragment

  • 1 靜態(tài)的使用Fragment
    首先我先創(chuàng)建了一個空的Activity
    MainActivity

接著我又創(chuàng)建了兩個Fragment的.xml文件皱卓,分別是fragment1.xml裹芝,和fragment2.xml


Layout
fragment1
fragment2
<?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:fitsSystemWindows="true"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <android.support.design.widget.AppBarLayout android:layout_height="wrap_content"
        android:layout_width="match_parent" android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar android:id="@+id/toolbar"
            android:layout_width="match_parent" android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <fragment
        android:name="com.example.fuerm.myapplication.Fragment1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="50"
        tools:layout="@layout/fragment1" />

    <fragment
        android:name="com.example.fuerm.myapplication.Fragment2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="50"
        tools:layout="@layout/fragment2" />

</LinearLayout>


在Activity的布局代碼中,我們將兩個fragment直接像當作普通部件一樣娜汁,放入Activity的Layout中嫂易,在此我在MainActivity中采用了垂直線性布局,LayoutWight各占50%掐禁,代碼如上怜械,MainActivity的布局效果如下圖

MainActivity

以上就是Fragment靜態(tài)的使用方法。

  • 2 Fragment的動態(tài)使用方法
    接下來傅事,我們創(chuàng)建另一個工程缕允,帶有側(cè)邊漢堡菜單的APP.如圖
    image.png

我們想實現(xiàn)當側(cè)邊漢堡菜單彈出時,點擊漢堡菜單的按鈕蹭越,主Activity的內(nèi)容也相應(yīng)改變障本。
首先還是想剛才一樣創(chuàng)建兩個Fragment.
然后再分別創(chuàng)建兩個繼承自Fragment的類 Fragment1 和Fragment2.
代碼如下:

public class Fragment1 extends Fragment{
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

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

        View v = inflater.inflate(R.layout.fragment2,container,false);
        return v;
    }
}

然后我們需要在layout_content中添加一個布局,以作Fragment的Container.這個布局可以是LinearLayout响鹃,RelativeLayourt彼绷,F(xiàn)rameLayout或者其他,在此以FrameLayout為例茴迁,代碼如下:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    android:id="@+id/fragment_container"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:showIn="@layout/app_bar_main"
    tools:context=".MainActivity"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

然后我們整個屏幕都用來顯示Fragment寄悯,所以其余的東西什么都不加。
然后堕义,我們需要在MainActivity.java中去創(chuàng)建 這兩個Fragment并動態(tài)的加載它們猜旬。

Fragment1 fragment1;    //創(chuàng)建一個Fragment1對象
Fragment2 fragment2;    //創(chuàng)建一個Fragment2對象
FragmentTranscation f;  //創(chuàng)建一個FragmentTranscation對象,這個是用來動態(tài)加載Fragment的

之后在MainActivity.java中的 onNavigationItemSelected(MenuItem item) 方法中,我們加入如fragment動態(tài)切換的方法:

@Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();
        f = getFragmentManager().beginTransaction();  //給f初始化
        fragment1 = new Fragment1();                  //對象初始化
        fragment2 = new Fragment2();                  //對象初始化
        //建議用switch語句倦卖,這是系統(tǒng)自己生成的
        if (id == R.id.nav_camara) {
            //以下是重點
            f = getFragmentManager().beginTransaction();//調(diào)用FragmentManager洒擦,并開始事務(wù)處理
            f.replace(R.id.fragment_container, fragment1);//替換一個fragment給我們的FrameLayout,這里需要說明一下怕膛,正常邏輯你應(yīng)該在你的OnCreat( )方法中去實現(xiàn)FramLayout的初始布局熟嫩。方法和如下是一樣的
            f.commit();//提交事務(wù)
        } else if (id == R.id.nav_gallery) {
            f.replace(R.id.fragment_container, fragment2);//替換
            f.commit();
            //因為我們就兩個fragment,而菜單數(shù)多余我們褐捻,僅僅為了展示掸茅,下面的就不管了
        } else if (id == R.id.nav_slideshow) {

        } else if (id == R.id.nav_manage) {

        } else if (id == R.id.nav_share) {

        } else if (id == R.id.nav_send) {

        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

總結(jié)一下

動態(tài)的使用需要調(diào)用FragmentTranscation的FragmentMannger,通過getFragmentManager( )獲得柠逞,然后以提交事務(wù)的方式commit( )來添加add( )/replace( )或替換當前布局中的頁面昧狮。

現(xiàn)在程序可以跑起來了,效果如下


Screenshot_2016-04-20-22-55-40.png
Screenshot_2016-04-20-22-55-57.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末板壮,一起剝皮案震驚了整個濱河市逗鸣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖撒璧,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件透葛,死亡現(xiàn)場離奇詭異,居然都是意外死亡卿樱,警方通過查閱死者的電腦和手機获洲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來殿如,“玉大人,你說我怎么就攤上這事最爬∩婺伲” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵爱致,是天一觀的道長烤送。 經(jīng)常有香客問我,道長糠悯,這世上最難降的妖魔是什么帮坚? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮互艾,結(jié)果婚禮上试和,老公的妹妹穿的比我還像新娘。我一直安慰自己纫普,他們只是感情好阅悍,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著昨稼,像睡著了一般节视。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上假栓,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天寻行,我揣著相機與錄音,去河邊找鬼匾荆。 笑死拌蜘,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的牙丽。 我是一名探鬼主播拦坠,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼剩岳!你這毒婦竟也來了贞滨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎晓铆,沒想到半個月后勺良,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡骄噪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年尚困,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片链蕊。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡事甜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出滔韵,到底是詐尸還是另有隱情逻谦,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布陪蜻,位于F島的核電站邦马,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏宴卖。R本人自食惡果不足惜滋将,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望症昏。 院中可真熱鬧随闽,春花似錦、人聲如沸肝谭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽分苇。三九已至添诉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間医寿,已是汗流浹背栏赴。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留靖秩,地道東北人须眷。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像沟突,于是被迫代替她去往敵國和親花颗。 傳聞我的和親對象是個殘疾皇子魂贬,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容