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>
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 }
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 }
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 }