主要內(nèi)容:Fragment簡介伙狐、Fragment的生命周期、Fragment通信贷屎、兩個(gè)Fragment的跳轉(zhuǎn)
Fragment簡介
Fragment出現(xiàn)的初衷是為了適應(yīng)平板唉侄,通過Fragment對UI進(jìn)行模塊化的管理,然后根據(jù)不用的屏幕尺寸動(dòng)態(tài)的更新界面属划。Fragment必須被嵌入到Activity中使用同眯,雖然也擁有自己的生命周期,但是其生命周期受到它所在的Activity的控制须蜗。只有Activity處于活動(dòng)狀態(tài)唠粥,我們才能操作Fragment。
一大莫、Fragment的使用
- 創(chuàng)建一個(gè)類繼承自Fragment或者其子類(DialogFragment官份、ListFragment、PreferenceFragment或者WebViewFragment)舅巷。然后實(shí)現(xiàn)其中的一些方法:onCreate()钠右、onCreateView()、onStart()飒房、onResume()狠毯、onPause()、onStop()等嚼松。看實(shí)例:
public class fragment_1 extends Fragment {
public void fragment_1(){ }
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
View rootView = inflater.inflate(R.layout.fragment_1, container,false);
return rootView;
}
}
2.使用Fragment有兩種方式
-
靜態(tài)使用:把創(chuàng)建出來的Fragment作為一個(gè)控件來使用寝受。直接看代碼:
<fragment android:layout_width="wrap_content" android:layout_height="wrap_content" android:name="com.example.wly.fragmentdetail.fragment_1" />
- 動(dòng)態(tài)使用:
getSupportFragmentManager()
.beginTransaction()
.add(R.id.aty_main, new fragment_1())
.commit();
二很澄、Fragment相關(guān)的常用方法
Fragment是通過FragmentManager來管理的,我們可以通過getFragmentManager()來獲得它的實(shí)例。在Activity中器予,我們可以動(dòng)態(tài)的添加乾翔、刪除、替換以及執(zhí)行其他動(dòng)作反浓。這樣的每一個(gè)動(dòng)作叫做一個(gè)事務(wù)雷则。需要通過FragmentTransaction來執(zhí)行。
- 常用的三個(gè)類
Fragment 在
android.app
下和android.support.v4.app.
都有對應(yīng)類月劈。所以引用的時(shí)候不同文件下的引用文件要一直猜揪,不然會(huì)有問題。
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
2.常用API
獲取所在的Activity: getActivity()
獲取Fragment:Activity可以調(diào)用FragmentManager的findFragmentById()或findFragmentByTag()方法
獲取FragmentManager: getFragmentManager() // v4中腊凶,getSupportFragmentManager()
FragmentTransaction:fragmentManager.beginTransaction()
ps:下面的一下API是FragmentTransaction中的拴念。
FragmentTransaction transaction = fm.benginTransatcion();//開啟一個(gè)事務(wù)
**transaction.add() **
往Activity中添加一個(gè)Fragment
**transaction.remove() **
從Activity中移除一個(gè)Fragment,如果被移除的Fragment沒有添加到回退棧(回退棧后面會(huì)詳細(xì)說)划煮,這個(gè)Fragment實(shí)例將會(huì)被銷毀缔俄。
transaction.replace()
使用另一個(gè)Fragment替換當(dāng)前的器躏,實(shí)際上就是remove()然后add()的合體~
transaction.hide()
隱藏當(dāng)前的Fragment登失,僅僅是設(shè)為不可見挖炬,并不會(huì)銷毀
transaction.show()
顯示之前隱藏的Fragment
detach()
會(huì)將view從UI中移除,和remove()不同,此時(shí)fragment的狀態(tài)依然由FragmentManager維護(hù)。
attach()
重建view視圖馅巷,附加到UI上并顯示草姻。
transition.addToBackStack(null);
把當(dāng)前的Fragment添加到返回棧中
transatcion.commit()
做了上面一些列操作當(dāng)然需要把這個(gè)事務(wù)提交了,因?yàn)樯厦嬉呀?jīng)交代過了敞曹。對Fragment的操作就是一種事務(wù)综膀。
fragmentManager.popBackStack();
當(dāng)前的Fragment出棧。這里需要注意出棧操作是FragmentManager中的方法橄登。
下面是具體使用場合解析從鴻洋_大神拿來的担平!強(qiáng)烈推薦他的博客!其實(shí)我也關(guān)注了他的公眾號面褐,不過好像沒有太多更新取胎!
a、比如:我在FragmentA中的EditText填了一些數(shù)據(jù)匪傍,當(dāng)切換到FragmentB時(shí)觉痛,如果希望會(huì)到A還能看到數(shù)據(jù),則適合你的就是hide和show手蝎;也就是說,希望保留用戶操作的面板钉鸯,你可以使用hide和show邮辽,當(dāng)然了不要使勁在那new實(shí)例,進(jìn)行下非null判斷岩睁。
b揣云、再比如:我不希望保留用戶操作,你可以使用remove(),然后add()翎迁;或者使用replace()這個(gè)和remove,add是相同的效果净薛。
c、remove和detach有一點(diǎn)細(xì)微的區(qū)別痴腌,在不考慮回退棧的情況下燃领,remove會(huì)銷毀整個(gè)Fragment實(shí)例,而detach則只是銷毀其視圖結(jié)構(gòu)剥悟,實(shí)例并不會(huì)被銷毀曼库。那么二者怎么取舍使用呢?如果你的當(dāng)前Activity一直存在慈缔,那么在不希望保留用戶操作的時(shí)候种玛,你可以優(yōu)先使用detach瓤檐。
Fragment生命周期:
一距帅、Fragment的幾種狀態(tài):
與Activity類似括堤,F(xiàn)ragment也有一下幾種狀態(tài):
- 活動(dòng)狀態(tài):當(dāng)前Fragment位于前臺,可見讥电,可獲得焦點(diǎn)轧抗。
- 暫停狀態(tài):其他Activity位于前臺,該Fragment可見纠炮,不可獲得焦點(diǎn)灯蝴。
- 停止?fàn)顟B(tài):不可見,失去焦點(diǎn)耕肩。
- 銷毀狀態(tài):該Fragment被完全刪除或被結(jié)束问潭。
二、Fragment的一些生命周期方法:
在Fragment的生命周期中梳虽,有一下方法會(huì)被回調(diào):
- onAttach():當(dāng)Fragment被添加到Activity時(shí)被回調(diào)灾茁,只回調(diào)一次删顶。
- onCreate(Bundle savedStatus):創(chuàng)建Fragment時(shí)被回調(diào),一次逗余。
- onCreateView(): 每次創(chuàng)建、繪制該Fragment的View組件時(shí)回調(diào)腻格,F(xiàn)ragment將會(huì)顯示該方法返回的View組件菜职。
- onActivityCreated():Fragment所在的Activity啟動(dòng)完成后回調(diào)。
- onStart():每次啟動(dòng)或恢復(fù)Fragment時(shí)被回調(diào)蜜另。
- onResume():每次啟動(dòng)或恢復(fù)Fragment時(shí)被回調(diào)嫡意,onStart()回調(diào)后就會(huì)回調(diào)此方法。
- onPause():暫停時(shí)回調(diào)此迅。
- onStop():停止Fragment時(shí)回調(diào)旧巾。
- onDestroyView():銷毀Fragment的View組件時(shí)回調(diào)鲁猩。
- onDestroy():銷毀Fragment時(shí)調(diào)用,一次绳匀。
- onDetach():將Fragment從Activity中刪除疾棵、被替換完成時(shí)回到該方法痹仙,在onDestroy()之后回調(diào)。
三拟枚、Fragment生命周期與Activity的生命周期交叉:
這是補(bǔ)充:onCreateView()的作用是初始化Fragment的一些視圖控件恩溅,然后把Fragment視圖返回給Activity谓娃。如果在Fragment中用到了Activity的一些控件或者變量,需要在onActivityCreated()中通過getActivity()方法來取得所在的Activity奶稠,然后獲取需要的變量,此時(shí)都已初始化完成竹握。
四辆飘、Fragment傳遞參數(shù)
- Fragment與Activity之間的參數(shù)傳遞,有兩種方式:
- 在Fragment中通過getActivity()的方法可以獲得所在的Activity昧甘,然后就可以獲取其中的數(shù)據(jù)甚至修改其中的數(shù)據(jù)战得。
- 通過Bundle傳值
在Activity中:
AnotherFragment anotherFragment = new AnotherFragment();
Bundle bundle = new Bundle();
bundle.putString("data", "MainActivity 2 anotherFragment常侦!");
anotherFragment.setArguments(bundle);
getSupportFragmentManager().beginTransaction()
.add(R.id.one, anotherFragment, "another")
.commit();
接收參數(shù):
Bundle bundle = getArguments();
Toast.makeText(getActivity(), bundle.getString("data"), Toast.LENGTH_LONG).show();
也可以通過接口回調(diào)的形式,給Activity回傳
在Fragment中聲明接口變量肘习,然后在Activity中實(shí)現(xiàn)接口坡倔。在Fragment的onViewCreated()方法中給對應(yīng)的接口變量賦值為對應(yīng)的Activity罪塔。并調(diào)用接口實(shí)現(xiàn)方法,把參數(shù)通過接口方法回傳回去瘩缆。
五佃蚜、兩個(gè)Fragment之間的跳轉(zhuǎn)
1.從Fragment到Activity的跳轉(zhuǎn),直接看代碼熟尉,和Activity的跳轉(zhuǎn)沒有太大區(qū)別:
Intent intent = new Intent(getActivity(), LoginActivity.class);
startActivity(intent);
2.從Fragment到Fragment的跳轉(zhuǎn):
LoginFragment loginFg = new LoginFragment();
getFragmentManager()
.beginTransaction()
.replace(R.id.main_layout, loginFg, "LoginFragment")
.addToBackStack(null)
.commit();
這里需要注意addToBackStack(null)這個(gè)方法洲脂,假如不把前一個(gè)Fragment放到后退棧中,那么這個(gè)Fragment就會(huì)被銷毀雇毫。放進(jìn)去,一般情況下不會(huì)被銷毀(內(nèi)存緊張的情況下可能會(huì)銷毀)枚粘。
結(jié)束語:這里總結(jié)了一下Fragment的基本用法馍迄,其實(shí)關(guān)于FragmentManager局骤,還有相關(guān)的replace、add等方法都需要去深究赘来,翻一翻源碼凯傲。但是現(xiàn)在首要任務(wù)是會(huì)用這些東西,然后去找一份工作幌缝。那些東西還是需要具體用的時(shí)候去深究诫欠!