寫在前面的話
是的珠移,你沒有看錯,是(五)末融,你也不用再找了,這里沒有一二三四暇韧,直接就是五啦勾习,因為一二三四在這里。懈玻。巧婶。好久沒寫安卓的博客了,之前定好的要在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的效果,先看效果圖:
這里我們可以看到點擊按鍵后界面就進行切換了捶障,這里一個動態(tài)的fragment的切換主要是以下五個步驟:
- 創(chuàng)建一個fragment實例僧须,
- 獲取FragmentManager,在activity中可以直接調(diào)用
getFragmentManager()
來獲取项炼, - 開啟一個事務担平,通過
beginTransaction()
來開啟, - 向容器添加fragment锭部,一般采用
replace()
來切換暂论,需要傳入容器的id以及要替換的fragment實例, - 提交事務拌禾,使用
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講解上的一張圖片泼各。
先不著急說明鞍时,先到代碼中將生命周期打印出來。打開程序:
FirstFragment首次加載扣蜻,生命周期是
onAttach()
-->onCreate()
-->onCreateView()
-->onActivityCreated()
-->onStart()
-->onResume
逆巍。然后我們點擊button去切換到SecondFragment:
我們看到FirstFragment先執(zhí)行
onPause()
-->onStop()
-->onDestoryView()
。然后SecondFragment再執(zhí)行莽使。我們再按返回鍵返回到FirstFragment:看這里SecondFragment在執(zhí)行完
onDestoryView()
后又執(zhí)行了onDestory()
-->onDetach()
锐极。FirstFragment則直接從onActivityCreated()
開始執(zhí)行。接著我們再按返回鍵退出程序:這里FirstFragment才去執(zhí)行
onDestoryView()
等方法芳肌。我們再看官網(wǎng)上的另一張圖這樣這張圖是不是更好理解了呢灵再。這里我沒有把activity的生命周期也加入打印,希望有條件的同學自己去敲敲代碼亿笤,看看兩者間的關(guān)系是不是像第一張圖那樣的翎迁。
這樣最簡單的一個fragment就寫完了,但這基本上沒有什么實際意義责嚷,下一篇文章將會寫一個簡單的底部tab欄切換鸳兽,使用viewpaper+fragment。
寫在最后的話
耽擱了這么久才寫完這篇罕拂,目標也是沒有達到。這大半年間也是經(jīng)歷了許多全陨,工作爆班,生活都是有了大的變化,有開心辱姨,也有失落柿菩。重新?lián)炱鹞磳懲甑牟┛停總€人都在拼搏雨涛,有時候看到些負能量的段子--“比我聰明的人還在努力枢舶,我他媽的努力還有什么用”,微微一笑替久,是啊凉泄,這里確實比我還優(yōu)秀的人都比我還努力,我努力還有什么用呢蚯根。安下心來后众,認清自己只是個普通人,不要總活在夢中,腳踏實地的干活蒂誉,學習教藻。羅馬不是一天建成的,騰訊帝國不是一蹴而就的右锨,誰沒有經(jīng)歷過失敗呢括堤。一步一步的走,一步一步的犯錯绍移,一步一步的改正悄窃,一步一步的走向成功。路飛用了兩年來升級登夫,我給自己三年時間來升級广匙。北京升級之路。(吐槽:這最后一段總是廢話恼策,還不連貫鸦致,整個思想都是亂的,你這叫我怎么看(╯‵□′)╯︵┻━┻涣楷,再不好好寫文章我就取關(guān)啦分唾,哼!)哈哈狮斗,你們是不是這么想绽乔,要是我猜對了就果斷給我點波關(guān)注唄,會繼續(xù)寫android以及React-Native的文章碳褒。謝謝啦折砸!
學習路漫漫,吾將上下而求索沙峻。