關於Fragement的學習

longmanma發表於2021-09-09

1. 當Fragment與Activity發生關聯時呼叫。

      //onCreateView(LayoutInflater, ViewGroup,Bundle)


     如果使用Android3.0以下的版本,需要引入v4的包,然後Activity繼承FragmentActivity,

     然後透過getSupportFragmentManager獲得FragmentManager。

2、Fragment家族常用的API

       Fragment常用的三個類:

       android.app.Fragment 主要用於定義Fragment

       android.app.FragmentManager 主要用於在Activity中操作Fragment

       android.app.FragmentTransaction 保證一些列Fragment操作的原子性,熟悉事務這個詞,一定能明白~

       a、獲取FragmentManage的方式:

            getFragmentManager() // v4中,getSupportFragmentManager

       b、主要的操作都是FragmentTransaction的方法

            FragmentTransaction transaction = fm.benginTransatcion();//開啟一個事務

           

3.往Activity中新增一個Fragment

            transaction.add() 

從Activity中移除一個Fragment,如果被移除的Fragment沒有新增到回退棧(回退棧後面會詳細說),這個Fragment例項將會被銷燬。

            transaction.remove() 

使用另一個Fragment替換當前的,實際上就是remove()然後add()的合體~

           transaction.replace()

隱藏當前的Fragment,僅僅是設為不可見,並不會銷燬

            transaction.hide()

顯示之前隱藏的Fragment

           transaction.show()

會將view從UI中移除,和remove()不同,此時fragment的狀態依然由FragmentManager維護。

           detach()

重建view檢視,附加到UI上並顯示。

           attach()

提交一個事務

transatcion.commit()

注意:常用Fragment的哥們,可能會經常遇到這樣Activity狀態不一致:State loss這樣的錯誤。主要是因為:commit方法一定要在Activity.onSaveInstance()之前呼叫。

           上述,基本是操作Fragment的所有的方式了,在一個事務開啟到提交可以進行多個的新增、移除、替換等操作。

值得注意的是:如果你喜歡使用Fragment,一定要清楚這些方法,哪個會銷燬檢視,哪個會銷燬例項,哪個僅僅只是隱藏,這樣才能更好的使用它們。

a、比如:我在FragmentA中的EditText填了一些資料,當切換到FragmentB時,如果希望會到A還能看到資料,則適合你的就是hide和show;也就是說,希望保留使用者操作的皮膚,你可以使用hide和show,當然了不要使勁在那new例項,進行下非null判斷。

b、再比如:我不希望保留使用者操作,你可以使用remove(),然後add();或者使用replace()這個和remove,add是相同的效果。

c、remove和detach有一點細微的區別,在不考慮回退棧的情況下,remove會銷燬整個Fragment例項,而detach則只是銷燬其檢視結構,例項並不會被銷燬。那麼二者怎麼取捨使用呢?如果你的當前Activity一直存在,那麼在不希望保留使用者操作的時候,你可以優先使用detach。

4.

主Activity向子Fragement傳值

主Activity

                       case 0:

if (inforf == null) {

inforf = new InformationFragment();

Bundle bundle1 = new Bundle();

bundle1.putString("device_id",device_id);

inforf.setArguments(bundle1);

lf.add(inforf);

transaction.add(R.id.ll_fragment, inforf);

}

子Fragement

Bundle bundle1 = getArguments();

jnr=bundle1.getString("jnr");

原文連結:http://www.apkbus.com/blog-638599-59387.html

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2730/viewspace-2816599/,如需轉載,請註明出處,否則將追究法律責任。

相關文章