欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

Android學(xué)習(xí)筆記十三.深入理解fragment(一) - 新聞資訊 - 云南小程序開發(fā)|云南軟件開發(fā)|云南網(wǎng)站建設(shè)-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設(shè)/小程序開發(fā)/軟件開發(fā)

知識(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í)提供便捷的支持!

您當(dāng)前位置>首頁 » 新聞資訊 » 技術(shù)分享 >

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)案例查看更多