Android Fragment動態添加 FragmentTransaction FragmentManager

Fragment經常使用的三個類:
android.app.Fragment 主要用於定義Fragment
android.app.FragmentManager 主要用於在Activity中操做Fragment
android.app.FragmentTransaction 保證一些列Fragment操做的原子性

java

獲取FragmentManage的方式:  android

  getFragmentManager()
  getSupportFragmentManager //v4中FragmentActivity

app

主要的操做都是FragmentTransaction的方法less

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

  transaction.add() //往Activity中添加一個Fragmentspa

  transaction.remove() //從Activity中移除一個Fragment,若是被移除的Fragment沒有添加到回退棧(回退棧後面會詳細說),這個Fragment實例將會被銷燬。3d

  transaction.replace()//使用另外一個Fragment替換當前的,實際上就是remove()而後add()的合體~code

  transaction.hide() //當你的fragment數量固定不多時隱藏當前的Fragment,僅僅是設爲不可見,並不會銷燬,多的時候可能出現OOM異常,xml

  transaction.show()//顯示以前隱藏的Fragmentblog

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

  attach()重建view視圖,附加到UI上並顯示。

  transatcion.commit()//提交一個事務

 

若是你喜歡使用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。

 

 

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:id="@+id/activity_main"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent"
 6     android:orientation="vertical"
 7     tools:context="com.example.lesson10_fragment2.MainActivity">
 8 
 9     <Button
10         android:id="@+id/btn_add"
11         android:layout_width="match_parent"
12         android:layout_height="wrap_content"
13         android:onClick="add"
14         android:text="添加Fragment"
15         android:textAllCaps="false" />
16 
17     <Button
18         android:id="@+id/btn_remove"
19         android:layout_width="match_parent"
20         android:layout_height="wrap_content"
21         android:onClick="remove"
22         android:text="移除Fragment"
23         android:textAllCaps="false" />
24 
25     <Button
26         android:layout_width="match_parent"
27         android:layout_height="wrap_content"
28         android:onClick="replace"
29         android:text="替換Fragment"
30         android:textAllCaps="false" />
31 
32     <Button
33         android:id="@+id/btn_attach"
34         android:layout_width="match_parent"
35         android:layout_height="wrap_content"
36         android:onClick="attach"
37         android:text="附加Fragment"
38         android:textAllCaps="false" />
39 
40     <Button
41         android:id="@+id/btn_detach"
42         android:layout_width="match_parent"
43         android:layout_height="wrap_content"
44         android:onClick="detach"
45         android:text="移除附加Fragment"
46         android:textAllCaps="false" />
47 
48     <Button
49         android:id="@+id/btn_show"
50         android:layout_width="match_parent"
51         android:layout_height="wrap_content"
52         android:onClick="show"
53         android:text="顯示Fragment"
54         android:textAllCaps="false" />
55 
56     <Button
57         android:id="@+id/btn_hide"
58         android:layout_width="match_parent"
59         android:layout_height="wrap_content"
60         android:onClick="hide"
61         android:text="隱藏Fragment"
62         android:textAllCaps="false" />
63 
64     <!--動態加載,必需要給定一個空間用來加載Fragment 必須是一個FrameLayout !-->
65     <FrameLayout
66         android:id="@+id/fl_content"
67         android:layout_width="match_parent"
68         android:layout_height="wrap_content">
69 
70     </FrameLayout>
71 </LinearLayout>
activity_main.xml
 1 public class TextFragment extends Fragment {
 2 
 3     @Override
 4     public void onAttach(Context context) {
 5         super.onAttach(context);
 6         Log.e("TAG","----TextFragment-----onAttach");
 7     }
 8 
 9     @Override
10     public void onCreate(@Nullable Bundle savedInstanceState) {
11         super.onCreate(savedInstanceState);
12         Log.e("TAG","----TextFragment-----onCreate");
13     }
14 
15     @Nullable
16     @Override
17     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
18         Log.e("TAG","----TextFragment-----onCreateView");
19         EditText et = new EditText(getActivity());
20         et.setHint("動態加載的text");
21         return et;
22     }
23 
24     @Override
25     public void onStart() {
26         super.onStart();
27         Log.e("TAG","----TextFragment-----onStart");
28     }
29 
30     @Override
31     public void onActivityCreated(@Nullable Bundle savedInstanceState) {
32         super.onActivityCreated(savedInstanceState);
33         Log.e("TAG","----TextFragment-----onActivityCreated");
34     }
35 
36     @Override
37     public void onResume() {
38         super.onResume();
39         Log.e("TAG","----TextFragment-----onResume");
40     }
41 
42     @Override
43     public void onPause() {
44         super.onPause();
45         Log.e("TAG","----TextFragment-----onPause");
46     }
47 
48     @Override
49     public void onStop() {
50         super.onStop();
51         Log.e("TAG","----TextFragment-----onStop");
52     }
53 
54     @Override
55     public void onDestroyView() {
56         super.onDestroyView();
57         Log.e("TAG","----TextFragment-----onDestroyView");
58     }
59 
60     @Override
61     public void onDestroy() {
62         super.onDestroy();
63         Log.e("TAG","----TextFragment-----onDestroy");
64     }
65 
66     @Override
67     public void onDetach() {
68         super.onDetach();
69         Log.e("TAG","----TextFragment-----onDetach");
70     }
71 }
TextFragment.java
 1 public class ImageFragment extends Fragment{
 2 
 3     @Nullable
 4     @Override
 5     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
 6         ImageView img = new ImageView(getActivity());
 7         img.setImageResource(R.mipmap.ic_launcher);
 8         return img;
 9     }
10 }
ImageFragment.java
 1 public class MainActivity extends AppCompatActivity {
 2 
 3     TextFragment textFragment;
 4     ImageFragment imgFragment;
 5     @Override
 6     protected void onCreate(Bundle savedInstanceState) {
 7         super.onCreate(savedInstanceState);
 8         setContentView(R.layout.activity_main);
 9 
10         textFragment = new TextFragment();
11         imgFragment = new ImageFragment();
12     }
13 
14     public void add(View v){
15         //建立事務
16         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
17         //操做指令
18         ft.add(R.id.fl_content,textFragment);
19         //提交事務
20         ft.commit();
21     }
22     public void remove(View v){
23         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
24         //從Activity中移除一個Fragment,若是被移除的Fragment沒有添加到回退棧(回退棧後面會詳細說),這個Fragment實例將會被銷燬。
25         ft.remove(textFragment);
26         ft.commit();
27     }
28 
29     public void replace(View v){
30         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
31         //使用另外一個Fragment替換當前的,實際上就是remove()而後add()的合體
32         ft.replace(R.id.fl_content,imgFragment);
33         ft.commit();
34     }
35 
36     public void attach(View v){
37         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
38         //重建視圖,附件到UI上並顯示
39         ft.attach(textFragment);
40         ft.commit();
41     }
42     public void detach(View v){
43         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
44         //會將view從UI中移除,和remove()不一樣,此時fragment的狀態依然由FragmentManager維護
45         ft.detach(textFragment);
46         ft.commit();
47     }
48     public void show(View v){
49         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
50         //顯示以前隱藏的Fragment
51         ft.show(textFragment);
52         ft.commit();
53     }
54     public void hide(View v){
55         FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
56         //當你的fragment數量固定不多時隱藏當前的Fragment,僅僅是設爲不可見,並不會銷燬
57         ft.hide(textFragment);
58         ft.commit();
59     }
60 }
MainActivity.java
相關文章
相關標籤/搜索