知識(shí)
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營銷的便利,運(yùn)營的高效,讓網(wǎng)站成為營銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!
Android學(xué)習(xí)筆記十三.深入理解fragment(一)
發(fā)表時(shí)間:2020-10-19
發(fā)布人:葵宇科技
瀏覽次數(shù):49
深刻懂得fragment(一)
Fragment是Android3.0惹人的新API,可以把Fragment想成Activity中的模塊,這個(gè)模塊有本身的構(gòu)造,有本身的生命周期,零丁處理本身的輸入,在Activity運(yùn)行的時(shí)刻可以加載或者移除Fragment模塊。 可以把Fragment設(shè)計(jì)成可以在多個(gè)Activity中復(fù)竽暌姑的模塊,當(dāng)開辟的應(yīng)用法度榜樣同時(shí)實(shí)用于平板電腦和手機(jī)時(shí),可以應(yīng)用Fragment實(shí)現(xiàn)靈活的構(gòu)造,改良用戶體驗(yàn)。
[img]http://img.blog.csdn.net/20150104174430573?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjYzNzUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
一、Fragment的特點(diǎn)
1.Fragment老是作為Activity界面的構(gòu)成部分。Fragment可調(diào)用getActvity()辦法獲取它地點(diǎn)的Activity,Activity可調(diào)用FragmentManager的findFragmentById()或findFragmentByTag()辦法來獲取Fragment。個(gè)中,fragment的id或tag在其構(gòu)造文件<fragment../>元素中定義。
2.在Activity運(yùn)行過程中,可調(diào)用FragmentManager的add()、remove()、WordStr()、辦法動(dòng)態(tài)地添加、刪除或調(diào)換Fragment。
3.一個(gè)Activity可以同時(shí)組合多個(gè)Fragment;反過來,一個(gè)Fragment也可能被多個(gè)Activity復(fù)竽暌姑;
4.Fragment可以響應(yīng)本身的輸入事宜、并擁有本身的聲明周期,但它們的生命周期直接被其他所屬的Activity的生命周期控制。
二、Fragment的生命周期
因?yàn)镕ragment必須嵌入在Acitivity中應(yīng)用,所以Fragment的生命周期和它地點(diǎn)的Activity是密切相干的。如不雅Activity是暫停狀況,個(gè)中所有的Fragment都是暫停狀況;如不雅Activity是stopped狀況,這個(gè)Activity中所有的Fragment都不克不及被啟動(dòng);如不雅Activity被燒毀,那么它個(gè)中的所有Fragment都邑被燒毀。然則,當(dāng)Activity在晃蕩狀況,可以自力控制Fragment的狀況,比如加上或者移除Fragment。當(dāng)如許進(jìn)行fragment transaction(轉(zhuǎn)換)的時(shí)刻,可以把fragment放入Activity的back stack中,如許用戶就可以進(jìn)行返回操作。
1.Fragment的幾個(gè)狀況
(1)晃蕩狀況:當(dāng)前Fragment位于前臺(tái),用戶可見、可以獲得核心;
(2)暫停狀況:其他Acitvity位于前臺(tái),該Fragment依然可見,只是不克不及獲得核心;
(3)停止?fàn)顩r:該Fragment弗成見,掉去核心
(4)燒毀狀況:該fragment被完全刪除,或者Fragment地點(diǎn)的Activity被停止
2.與Fragment有關(guān)的辦法
如最常見的就是onCreateView()辦法,其感化是返回一個(gè)View對(duì)象將Fragment顯示出來。
[img]http://img.blog.csdn.net/20150104174459933?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjYzNzUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
三、Fragment所需的庫
應(yīng)用Fragment時(shí),須要持續(xù)Fragment或者Fragment的子類(DialogFragment, ListFragment, PreferenceFragment, WebViewFragment),所以Fragment的代碼看起來和Activity的類似。因?yàn)镕ragment是Android 3.0及以上體系特有的API,如不雅我們須要開辟低版本的應(yīng)用軟件,則須要惹人Fragment所支撐的庫。
Support Library是一個(gè)供給了API庫函數(shù)的JAR文件,如許就可以在舊版本的Android上應(yīng)用一些新版本的APIs.比如android-support-v4.jar.它的完全路徑是:
<sdk>/extras/android/support/v4/android-support-v4.jar. 它就供給了Fragment的APIs,使得在Android 1.6 (API level 4)以上的體系都可以應(yīng)用Fragment。應(yīng)用該支撐庫須要分兩步:
1.添加支撐庫到工程項(xiàng)目中
將上述的包拷入libs項(xiàng)面前目今的libs文件夾,然后在項(xiàng)目標(biāo)Properties中添加:右鍵單擊項(xiàng)目,選Properties,左邊選Java Build Path,然后Add External JARs…,添加android-support-v4.jar.
[img]http://img.blog.csdn.net/20150104174517966?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjYzNzUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
[img]http://blog.csdn.net/u012637501/article/details/42395259/file:/C:/Users/Jiangdongguo/AppData/Local/YNote/data/[email protected]/5ba3b6b05aed44bca7a3526513263b4b/clipboard.png
2.導(dǎo)入Fragment、FragmentManager到工程中
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
留意,當(dāng)創(chuàng)建包含F(xiàn)ragment的Activity時(shí),如不雅用的是Support Library,那么持續(xù)的就應(yīng)當(dāng)是FragmentActivity而不是Activity.
四、Fragment核心分析
1.創(chuàng)建Fragement,并設(shè)置該Fragment的顯示界面
與創(chuàng)建Activity類似,開辟者實(shí)現(xiàn)的Fragment必須持續(xù)Fragment基類,Android供給了4種Fragment:(1)DialogFragment-對(duì)話框界面的Fragment;(2)ListFragment-實(shí)現(xiàn)列表界面的Fragment;(3)PreferenceFragment-選項(xiàng)設(shè)置界面的Fragment;(4)WebViewFragment-WebView界面的Fragment。創(chuàng)建Fragment平日須要實(shí)現(xiàn)三個(gè)回調(diào)辦法:
(1)onCreate()
體系在創(chuàng)建Fragment的時(shí)刻調(diào)用這個(gè)辦法,這里應(yīng)當(dāng)初始化相干的組件,一些即就是被暫停或者被停止時(shí)依然須要保存的器械。
(2)onCreateView()
當(dāng)?shù)谝淮卫L制Fragment的UI時(shí)體系調(diào)用這個(gè)辦法,必須返回一個(gè)View。組件View對(duì)應(yīng)的構(gòu)造文件,即為該Fragment將會(huì)顯示的界面。如不雅Fragment不供給UI也可以返回null。
留意,如不雅持續(xù)自ListFragment,onCreateView()默認(rèn)的實(shí)現(xiàn)會(huì)返回一個(gè)ListView,所以不消本身實(shí)現(xiàn)。
(3)onPause()
當(dāng)用戶分開Fragment時(shí)第一個(gè)調(diào)用這個(gè)辦法,須要提交一些變更,因?yàn)橛脩艉芸赡懿辉俜祷貋怼?
示例1:實(shí)現(xiàn)一個(gè)Fragment的構(gòu)造界面。經(jīng)由過程onCreateView()辦法,將example_fragment構(gòu)造資本文件設(shè)置為該Fragment的顯示界面。
源碼:
public static class ExampleFragment extends Fragment
{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
// Inflate the layout for this fragment
return inflater.inflate(R.layout.example_fragment, //指清楚明了當(dāng)前的Fragment對(duì)應(yīng)的資本文件
container, //父容器控件
false); //*注解是否鏈接該構(gòu)造和其父容器。這里設(shè)置為false,是因?yàn)轶w系已經(jīng)插入了
這個(gè)構(gòu)造到父控件,設(shè)置為true將會(huì)產(chǎn)生多余的一個(gè)View Group*/
}
}
注釋:onCreateView辦法中container參數(shù)代表該Fragment在Acitivity的父控件;savedInstanceState供給了上一個(gè)實(shí)例的數(shù)據(jù)。
2.把一個(gè)Fragment參加到Activity中
Fragment不克不及零丁存在,必須依附在Activity上。當(dāng)Fragment被參加到指定的Activity中時(shí),它會(huì)處在對(duì)應(yīng)的View Group中。平日,F(xiàn)ragment加載到一個(gè)Activity有兩種方法:一種是在layout中應(yīng)用標(biāo)簽<fragment>聲明;另一種辦法是在代碼中把Fragment參加到一個(gè)Activity的指定ViewGroup中。
(1)經(jīng)由過程被加載Activity的構(gòu)造文件將Fragment加載到指定Acitivity
我們只需在指定Activity的構(gòu)造文件中,添加一個(gè)<fragment.../>元素將Fragment作為一個(gè)子標(biāo)簽參加即可。
示例2:實(shí)現(xiàn)加載一個(gè)列表Fragment到指定的Activity中顯示
源碼:
<?xml version="1.0" encoding="utf-8"?> <!-- 定義一個(gè)水等分列的LinearLayout,并指定應(yīng)用中等分隔條 --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" android:layout_marginLeft="16dp" android:layout_marginRight="16dp" android:divider="?android:attr/dividerHorizontal" android:showDividers="middle"> <!-- 應(yīng)用資本文件方法:添加一個(gè)fragment到Activity中 --> <fragment android:name="com.example.android_fragment_1.BookListFragment" android:id="@+id/book_list" android:layout_height="match_parent" android:layout_width="0dp" android:layout_weight="1"/> </LinearLayout>
注釋:android:name屬性為該須要加載的Fragment完全類名(包.類名);android:id屬性為該Fragment的獨(dú)一標(biāo)識(shí)符ID,我們可以經(jīng)由過程ID實(shí)現(xiàn)對(duì)該Fragment進(jìn)行添加、刪除等操作。
(2)應(yīng)用FragmentManager和FragmentTransaction將一個(gè)Fragment加載到指定Activity的ViewGroup中
當(dāng)Activity處于Running狀況下的時(shí)刻,可以應(yīng)用這種辦法在Activity的構(gòu)造中動(dòng)態(tài)地參加Fragment,只須要指定參加這個(gè)Fragment的父View Group即可。
FragmentManager重要完成獲取指定Fragment,將Fragment大年夜后臺(tái)彈出棧、為后臺(tái)Fragment注冊(cè)一個(gè)監(jiān)聽器。
FragmentTransaction則完成Fragment的添加、刪除、調(diào)換等事務(wù),每個(gè)FragmentTransaction可以包含多個(gè)對(duì)Fragment修改,比如包含調(diào)用了多了add()、remove()和WordStr()操作,最后還調(diào)用commit()辦法提交事務(wù)即可。
起首、經(jīng)由過程FragmentManager對(duì)象獲得一個(gè)FragmentTransaction對(duì)象,借助FragmentTransaction對(duì)象實(shí)現(xiàn)Acitivity對(duì)Fragment履行添加、刪除、調(diào)換等操作。
FragmentManager fragmentManager=getFragmentManager(); //如用的是支撐包,則為getSupportFragmentManager()
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();//打開事務(wù)
其次,將實(shí)現(xiàn)的名為BookListFragment的Fragment添加到View Group中
BookListFragment booklistfragment = new BookListFragment(); //創(chuàng)建一個(gè)圖書列表Fragment
fragmentTransaction.add(R.id.fragment_container, booklistfragment ); //添加圖書列表Fragment到標(biāo)識(shí)為fragment_container容器
fragmentTransaction.commit(); //提交事務(wù)改變生效-使View容器顯示圖書列表Fragment
注釋1:如不雅想使應(yīng)用法度榜樣許可用戶按BACK返回鍵回到調(diào)換Fragment之前的狀況(即上一個(gè)Fragment),我們可以將事務(wù)添加到back棧。
fragmentTransaction.addtoBackStack(null);
注釋2:除了上述添加一個(gè)Fragment到Activity的View父容器中,還可聲調(diào)換或者刪除容器中已有的Fragment.調(diào)用commit()辦法使得FragmentTransaction實(shí)例的改變生效。
fragmentTransaction.WordStr(R.id.fragment_container, booklistfragment); //調(diào)換容器類已有的Fragment
注釋3:R.id.fragment_container為當(dāng)前Activity構(gòu)造中ID為fragment_container的容器,在Activity界面構(gòu)造文件中定義。
res/layout/main.xml
[img]http://blog.csdn.net/u012637501/article/details/42395259/file:/C:/Users/Jiangdongguo/AppData/Local/YNote/data/[email protected]/f8ad36bb3b734bb4b7ce10deb1d2afb0/clipboard.png[img]http://img.blog.csdn.net/20150104174604406?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjYzNzUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
3.Fragment與Activity通信
經(jīng)由過程第二步將一個(gè)Fragment加載到指定的Activity之后,該Fragment必須與Activity交互信息,這就須要Fragment能獲取它地點(diǎn)的Activity,Activity也能獲取它所包含的隨便率性的Fragment。
1)獲取目標(biāo)對(duì)象
(1)Fragment獲取它地點(diǎn)的Activity:
調(diào)用Fragment的getActivity()辦法即可返回它地點(diǎn)的Activity。
(2)Activity獲取它所包含的Fragment:
調(diào)用Activity接洽關(guān)系的FragmentManager的findFragmentById(int id)或findFragmentByTag(String tag)辦法即可獲取指定的Fragment。
ExampleFragment fragment =(ExampleFragment)getFragmentManager().findFragmentById(R.id.example_fragment)
注釋:我們可以在Activity界面元件中應(yīng)用<fragment.../>添加Fragment時(shí),可認(rèn)為<fragment../>元素添加android:name或android:tag屬性來標(biāo)識(shí)Fragment,接下來Activity將可以經(jīng)由過程findFragmentById(int id)等辦法來獲取Fragment。
2)Frament與Activity之間的數(shù)據(jù)傳遞
(1)Activity向Fragment傳遞數(shù)據(jù):
在Activity中創(chuàng)建Bundle數(shù)據(jù)包,并調(diào)用Fragment的setArguments(Bundle bundle)辦法即可將Bundle數(shù)據(jù)包傳給Fragment;
(2)Fragment向Activity傳遞數(shù)據(jù)或Activity需在Fragment運(yùn)行中進(jìn)行及時(shí)通信:
在Fragment中定義一個(gè)內(nèi)部回調(diào)接口,再讓包含該Fragment的Activity實(shí)現(xiàn)該回調(diào)接口,如許Fragment即可調(diào)用該回調(diào)辦法將數(shù)據(jù)傳給Activity。
3)activity響應(yīng)fragment的事宜完全解析
有時(shí),你可能須要fragment與activity共享事宜。一個(gè)好辦法是在fragment中定義一個(gè)回調(diào)接口,然后在activity中實(shí)現(xiàn)這個(gè)回調(diào)接口。
例如,照樣那個(gè)消息法度榜樣的例子,它有一個(gè)activity,activity中含有兩個(gè)fragment。fragmentA顯示消息標(biāo)題,fragmentB顯示標(biāo)題對(duì)應(yīng)的內(nèi)容。fragmentA必須在用戶選擇了某個(gè)標(biāo)題時(shí)告訴activity,然后activity再告訴fragmentB,fragmentB就顯示出對(duì)應(yīng)的內(nèi)容(為什么這么麻煩?直接fragmentA告訴fragmentB不就行了?也可以啊,然則你的fragment就削減了可重用的才能。如今我只需把我的事宜告訴宿主,由宿主決定若何處理,如許是不是重用性更好呢?)。如下例,
(1)在fragmentA(BookListFragment)中定義OnBookSelectedListener回調(diào)接口:
public class BookListFragment extends ListFragment
{
private OnBookSelectedListener whichbook; //接口對(duì)象
public interface OnBookSelectedListener
{
public void onBookSelected(Integer id); //參數(shù)為Map集合的鍵
}
.....
}
(2) 然后在activity實(shí)現(xiàn)接口OnBookSelectedListener,在辦法onBookSelected()中通知fragmentB(BookDetailFragment ),即Activity大年夜FragmentA獲取傳入的ID,用來啟動(dòng)FragmentB。
如下所示:
public class SelectBookActivity extends Activity implements BookListFragment.OnBookSelectedListener
{
......
public void onItemSelected(Integer id)
{
//a.創(chuàng)建Bundle,預(yù)備向Fragment傳入?yún)?shù)
Bundle bundle=new Bundle();
bundle.putInt(BookDetailFragment.ITEM_ID, id); //裝入值id到"item_id"鍵
//b.創(chuàng)建BookDetailFragment對(duì)象,并項(xiàng)Fragment傳入?yún)?shù)
BookDetailFragment fragment=new BookDetailFragment();
fragment.setArguments( bundle);
//c.應(yīng)用fragment調(diào)換book_detail_container容器當(dāng)前顯示的Fragment
getFragmentManager().beginTransaction()
.WordStr(R.id.book_detail_container, fragment)
.commit();
/*注釋:這一句等價(jià)于....
* FragmentManager Manager=getFragmentManager();
* FragmentTransaction Transaction=Manager.beginTransaction();
* Transaction.WordStr(R.id.book_detail_container, Manager);
* Transaction.commit();
* */
}
}
(3)實(shí)現(xiàn)fragmentA(BookListFragment)的onAttach()辦法,將fragmentA添加并顯示到Activity中
當(dāng)fragmentA添加到activity中時(shí),會(huì)調(diào)用fragmentA的辦法onAttach(),這個(gè)辦法中合適檢查activity是否實(shí)現(xiàn)了OnBookSelectedListener接口,檢查辦法就是對(duì)傳入的activity的實(shí)例進(jìn)行類型轉(zhuǎn)換,如不雅activity沒有實(shí)現(xiàn)那個(gè)接口,fragment拋出ClassCastException異常。如不雅成功了,mListener成員變量保存OnArticleSelectedListener的實(shí)例。于是fragmentA就可聲調(diào)用mListener的辦法來竽暌閨activity共享事宜。
public void onAttach(Activity activity)
{
super.onAttach(activity);
//a.如不雅Activity中沒有實(shí)現(xiàn)Callbacks接口,拋出異常
if(!(activity instanceof Callbacks))
{
throw new IllegalStateException("異常:BookListFragment地點(diǎn)的Activity必須實(shí)現(xiàn)Callback接口!");
}
//把該Activity當(dāng)成whichbook對(duì)象(缺乏這一句話,導(dǎo)致出現(xiàn)NullPointerException缺點(diǎn))
whichbook=( BookListFragment)activity;
}
(4)在fragmentA中實(shí)現(xiàn)onListItemClick()響應(yīng)activity發(fā)出的事宜(Fragment向Activity傳遞ID)
如不雅fragmentA是一個(gè)ListFragment,每次選中列表的一項(xiàng)時(shí),就會(huì)調(diào)用fragmentA的onListItemClick()辦法,在這個(gè)辦法中調(diào)用onBookSelected()來竽暌閨activity共享事宜。onBookSelected()傳入的參數(shù)id是列表的被選中的行ID,另一個(gè)fragment(B)( BookDetailFragment )用這個(gè)ID來大年夜法度榜樣的ContentProvider中取得標(biāo)題標(biāo)內(nèi)容。
@當(dāng)用戶單擊某列表項(xiàng)時(shí)激發(fā)該回調(diào)辦法
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
OnBookSelectedListener.onBookSelected(BookContent.ITEMS.get(position).id);//激發(fā) OnBookSelectedListener接口的onBookSelected辦法
}
[img]http://img.blog.csdn.net/20150104174608448?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjYzNzUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
[img]http://blog.csdn.net/u012637501/article/details/42395259/file:/C:/Users/Jiangdongguo/AppData/Local/YNote/data/[email protected]/e1c3b917a5384da58fb94accc55657d0/clipboard.png
參考:
http://www.cnblogs.com/mengdd/archive/2013/01/08/2851368.html
http://blog.csdn.net/t12x3456/article/details/8119607
相關(guān)案例查看更多
相關(guān)閱讀
- 關(guān)鍵詞快速排名
- 云南網(wǎng)站建設(shè)公司排名
- 云南省建設(shè)廳官方網(wǎng)站
- 云南網(wǎng)站建設(shè)首頁
- 保山小程序開發(fā)
- 全國前十名小程序開發(fā)公司
- 網(wǎng)站開發(fā)哪家好
- 云南網(wǎng)站建設(shè)制作
- 云南網(wǎng)站建設(shè)選
- 云南網(wǎng)站開發(fā)
- 云南建設(shè)廳網(wǎng)站首頁
- 小程序分銷商城
- 小程序公司
- 昆明做網(wǎng)站
- 江蘇小程序開發(fā)
- 小程序開發(fā)公司
- 網(wǎng)絡(luò)公司電話
- 軟件定制
- 小程序定制
- 定制小程序開發(fā)
- 大理網(wǎng)站建設(shè)公司
- 小程序設(shè)計(jì)
- 云南網(wǎng)站建設(shè)開發(fā)
- 網(wǎng)絡(luò)公司
- 汽車報(bào)廢回收管理系統(tǒng)
- 汽車報(bào)廢
- 英文網(wǎng)站建設(shè)公司
- web開發(fā)技術(shù)
- 跳轉(zhuǎn)小程序
- 汽車報(bào)廢軟件