Android學習筆記(五)——Fragment

寫在前面的話

是的珠移,你沒有看錯,是(五)末融,你也不用再找了,這里沒有一二三四暇韧,直接就是五啦勾习,因為一二三四在這里。懈玻。巧婶。好久沒寫安卓的博客了,之前定好的要在2016年前寫完這個系列的目標也是失敗了涂乌,但文章總得要寫艺栈,這篇就是關(guān)于fragment的簡單使用。

什么是fragment

fragment的意思就是碎片湾盒,是一種可以嵌入在activity中的UI片段湿右,可以最大化的利用手機的屏幕。現(xiàn)在很多應用都使用了fragment罚勾,最常見的就是微信了毅人,微信下面的tab欄切換時,上面的內(nèi)容就是用fragment來顯示的尖殃≌奢海看看看,這么牛的微信都在用fragment送丰,我們趕緊來用他吧缔俄。

fragment生命周期

啥,又是生命周期,他又不是activity俐载,怎么還有生命周期呢铐懊。是的,fragment依托于activity而存在瞎疼,他是有生命周期的科乎,而且他的生命周期的理解最好還是和activity一起比較更容易理解。在說明他的生命周期之前贼急,我們先來實現(xiàn)一個簡單的fragment的例子茅茂。

我們先來寫兩個簡單的fragment,然后在MainActivity點擊按鍵來切換這兩個fragment。

第一個fragment

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout    
    xmlns:android="http://schemas.android.com/apk/res/android"    
    android:gravity="center"    
    android:background="@android:color/holo_blue_light"    
    android:orientation="vertical"    
    android:layout_width="match_parent"    
    android:layout_height="match_parent">    
    
    <TextView        
        android:text="第一個Fragment"        
        android:textSize="25sp"        
        android:layout_width="wrap_content"        
        android:layout_height="wrap_content" />
</LinearLayout>

第二個fragment

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:gravity="center"
    android:background="@android:color/holo_red_light"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:text="第二個Fragment"
        android:textSize="25sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

可以看到這兩個布局都非常簡單太抓,只是單純的設(shè)置了背景色以及一個TextView空闲。
然后實現(xiàn)這兩個fragment,新建兩個類FirstFragment和SecondFragment都繼承Fragment走敌,并將布局文件和類進行綁定碴倾。
FristFragment:
public class FirstFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.first_fragment,null);
        return view;
    }
}

SecordFragment:
public class SecondFragment extends Fragment{

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.second_fragment,null);
        return view;
    }
}

接下來是MainActivity的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_marginTop="10dp"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <Button
            android:gravity="center"
            android:id="@+id/btn_change"
            android:text="Change"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <FrameLayout
        android:id="@+id/framelayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <fragment
            android:id="@+id/fragment"
            android:name="com.example.jiang.fragmenttest.FirstFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            />

    </FrameLayout>


</LinearLayout>

這里使用了FrameLayout,他的特性就是會從左上角層疊布局掉丽。默認顯示的是FirstFragment

接下來看MainActivity的內(nèi)容跌榔,給button添加了點擊事件:

public class MainActivity extends AppCompatActivity {

    private Button btn_change;
    private SecondFragment secondFragment;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        btn_change = (Button) findViewById(R.id.btn_change);
        btn_change.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                secondFragment = new SecondFragment();
                FragmentManager fragmentManager = getFragmentManager();
                FragmentTransaction transaction = fragmentManager.beginTransaction();
                transaction.replace(R.id.framelayout,secondFragment);
                transaction.commit();
            }
        });

    }
}

這樣就可以實現(xiàn)點擊切換fragment的效果,先看效果圖:

簡單的fragment切換

這里我們可以看到點擊按鍵后界面就進行切換了捶障,這里一個動態(tài)的fragment的切換主要是以下五個步驟:

  1. 創(chuàng)建一個fragment實例僧须,
  2. 獲取FragmentManager,在activity中可以直接調(diào)用getFragmentManager()來獲取项炼,
  3. 開啟一個事務担平,通過beginTransaction()來開啟,
  4. 向容器添加fragment锭部,一般采用replace()來切換暂论,需要傳入容器的id以及要替換的fragment實例,
  5. 提交事務拌禾,使用commit()方法取胎。

這樣就是可以動態(tài)的切換一個fragment。這里我們發(fā)現(xiàn)在我們切換了fragment后再按下返回鍵蹋砚,程序竟然不是返回到第一個fragment而是直接退出了扼菠。這樣很不符合我們的操作習慣。這里我們就可以把事務加入到返回棧中坝咐。修改MainActivity中的代碼循榆,我這里就不貼全了。

      transaction.replace(R.id.framelayout,secondFragment);
      transaction.addToBackStack(null);
      transaction.commit();

重新編譯一次墨坚,就發(fā)現(xiàn)當按下返回鍵時就返回到了第一個fragment了秧饮。這里就不貼圖了映挂。
這只是一個最簡單的例子,我們就來參照這個例子來看一下fragment的生命周期盗尸。fragment是依托于activity的柑船,那么他的生命周期就與activity息息相關(guān),我們先來看看官網(wǎng)fragment講解上的一張圖片泼各。

activity_fragment_lifecycle

先不著急說明鞍时,先到代碼中將生命周期打印出來。打開程序:

FirstFragment首次加載

FirstFragment首次加載扣蜻,生命周期是onAttach()-->onCreate()-->onCreateView()-->onActivityCreated()-->onStart()-->onResume逆巍。
然后我們點擊button去切換到SecondFragment:
切換到SecondFragment

我們看到FirstFragment先執(zhí)行onPause()-->onStop()-->onDestoryView()。然后SecondFragment再執(zhí)行莽使。我們再按返回鍵返回到FirstFragment:
返回到FristFragment

看這里SecondFragment在執(zhí)行完onDestoryView()后又執(zhí)行了onDestory()-->onDetach()锐极。FirstFragment則直接從onActivityCreated()開始執(zhí)行。接著我們再按返回鍵退出程序:
退出程序

這里FirstFragment才去執(zhí)行onDestoryView()等方法芳肌。我們再看官網(wǎng)上的另一張圖
fragment_lifecycle.png

這樣這張圖是不是更好理解了呢灵再。這里我沒有把activity的生命周期也加入打印,希望有條件的同學自己去敲敲代碼亿笤,看看兩者間的關(guān)系是不是像第一張圖那樣的翎迁。

這樣最簡單的一個fragment就寫完了,但這基本上沒有什么實際意義责嚷,下一篇文章將會寫一個簡單的底部tab欄切換鸳兽,使用viewpaper+fragment。

寫在最后的話

耽擱了這么久才寫完這篇罕拂,目標也是沒有達到。這大半年間也是經(jīng)歷了許多全陨,工作爆班,生活都是有了大的變化,有開心辱姨,也有失落柿菩。重新?lián)炱鹞磳懲甑牟┛停總€人都在拼搏雨涛,有時候看到些負能量的段子--“比我聰明的人還在努力枢舶,我他媽的努力還有什么用”,微微一笑替久,是啊凉泄,這里確實比我還優(yōu)秀的人都比我還努力,我努力還有什么用呢蚯根。安下心來后众,認清自己只是個普通人,不要總活在夢中,腳踏實地的干活蒂誉,學習教藻。羅馬不是一天建成的,騰訊帝國不是一蹴而就的右锨,誰沒有經(jīng)歷過失敗呢括堤。一步一步的走,一步一步的犯錯绍移,一步一步的改正悄窃,一步一步的走向成功。路飛用了兩年來升級登夫,我給自己三年時間來升級广匙。北京升級之路。(吐槽:這最后一段總是廢話恼策,還不連貫鸦致,整個思想都是亂的,你這叫我怎么看(╯‵□′)╯︵┻━┻涣楷,再不好好寫文章我就取關(guān)啦分唾,哼!)哈哈狮斗,你們是不是這么想绽乔,要是我猜對了就果斷給我點波關(guān)注唄,會繼續(xù)寫android以及React-Native的文章碳褒。謝謝啦折砸!

學習路漫漫,吾將上下而求索沙峻。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末睦授,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子摔寨,更是在濱河造成了極大的恐慌去枷,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件是复,死亡現(xiàn)場離奇詭異删顶,居然都是意外死亡,警方通過查閱死者的電腦和手機淑廊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評論 3 385
  • 文/潘曉璐 我一進店門逗余,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蒋纬,你說我怎么就攤上這事猎荠〖崛酰” “怎么了?”我有些...
    開封第一講書人閱讀 157,435評論 0 348
  • 文/不壞的土叔 我叫張陵关摇,是天一觀的道長荒叶。 經(jīng)常有香客問我,道長输虱,這世上最難降的妖魔是什么些楣? 我笑而不...
    開封第一講書人閱讀 56,509評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮宪睹,結(jié)果婚禮上愁茁,老公的妹妹穿的比我還像新娘。我一直安慰自己亭病,他們只是感情好鹅很,可當我...
    茶點故事閱讀 65,611評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著罪帖,像睡著了一般促煮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上整袁,一...
    開封第一講書人閱讀 49,837評論 1 290
  • 那天冀泻,我揣著相機與錄音赖欣,去河邊找鬼。 笑死寞钥,一個胖子當著我的面吹牛椿胯,可吹牛的內(nèi)容都是我干的颅崩。 我是一名探鬼主播绒北,決...
    沈念sama閱讀 38,987評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼戳稽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了痹仙?” 一聲冷哼從身側(cè)響起陋桂,我...
    開封第一講書人閱讀 37,730評論 0 267
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蝶溶,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宣渗,經(jīng)...
    沈念sama閱讀 44,194評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡抖所,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,525評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了痕囱。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片田轧。...
    茶點故事閱讀 38,664評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鞍恢,靈堂內(nèi)的尸體忽然破棺而出傻粘,到底是詐尸還是另有隱情每窖,我是刑警寧澤,帶...
    沈念sama閱讀 34,334評論 4 330
  • 正文 年R本政府宣布弦悉,位于F島的核電站窒典,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏稽莉。R本人自食惡果不足惜瀑志,卻給世界環(huán)境...
    茶點故事閱讀 39,944評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望污秆。 院中可真熱鬧劈猪,春花似錦、人聲如沸良拼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽庸推。三九已至常侦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間予弧,已是汗流浹背刮吧。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留掖蛤,地道東北人杀捻。 一個月前我還...
    沈念sama閱讀 46,389評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像蚓庭,于是被迫代替她去往敵國和親致讥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,554評論 2 349

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