如圖是效果圖 我在下麵定義3個按鈕來實現3個fragment的切換(不過寫完後發現應該定義成RadioGroup的顏色好改變)通過這3個fragment來看看fragment的生命周期和切換時Fragment都會重新實例化 1 先看下第一種方法用的是FragmentTransaction andr....
如圖是效果圖 我在下麵定義3個按鈕來實現3個fragment的切換(不過寫完後發現應該定義成RadioGroup的顏色好改變)通過這3個fragment來看看fragment的生命周期和切換時Fragment都會重新實例化
1 先看下第一種方法用的是
FragmentTransaction android.support.v4.app.FragmentTransaction.replace(int containerViewId, Fragment fragment)
package com.demo.text; import com.demo.pullrefresh.R; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainFragment extends FragmentActivity implements OnClickListener { private Button btn_one, btn_two, btn_three; private Fragment01 fragment01; // private int currentIndex; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); Log.d("jiejie", "MainFragment————————————————onCreate"); setContentView(R.layout.mainfragment); btn_one = (Button) findViewById(R.id.bb_one); btn_two = (Button) findViewById(R.id.bb_two); btn_three = (Button) findViewById(R.id.bb_three); btn_one.setOnClickListener(this); btn_two.setOnClickListener(this); btn_three.setOnClickListener(this); btn_one.setSelected(true); fragment01 = new Fragment01(); // 獲取fragment管理器 FragmentManager fmm = getSupportFragmentManager(); // 打開事務 FragmentTransaction ftm = fmm.beginTransaction(); // 把內容顯示至幀佈局 ftm.replace(R.id.fl_layout, fragment01); // 提交 ftm.commit(); } @Override public void onClick(View arg0) { // TODO Auto-generated method stub switch (arg0.getId()) { case R.id.bb_one: btn_one.setSelected(true); btn_two.setSelected(false); btn_three.setSelected(false); // 創建fragment對象 // fragment01 = new Fragment01(); // 獲取fragment管理器 FragmentManager fm = getSupportFragmentManager(); // 打開事務 FragmentTransaction ft = fm.beginTransaction(); // 把內容顯示至幀佈局 ft.replace(R.id.fl_layout, fragment01); // 提交 ft.commit(); break; case R.id.bb_two: btn_one.setSelected(false); btn_two.setSelected(true); btn_three.setSelected(false); // 創建fragment對象 Fragment02 fragment012 = new Fragment02(); // 獲取fragment管理器 FragmentManager fm2 = getSupportFragmentManager(); // 打開事務 FragmentTransaction ft2 = fm2.beginTransaction(); // 把內容顯示至幀佈局 ft2.replace(R.id.fl_layout, fragment012); // 提交 ft2.commit(); break; case R.id.bb_three: btn_one.setSelected(false); btn_two.setSelected(false); btn_three.setSelected(true); // 創建fragment對象 Fragment03 fragment03 = new Fragment03(); // 獲取fragment管理器 FragmentManager fm3 = getSupportFragmentManager(); // 打開事務 FragmentTransaction ft3 = fm3.beginTransaction(); // 把內容顯示至幀佈局 ft3.replace(R.id.fl_layout, fragment03); // 提交 ft3.commit(); break; default: break; } } /** * 這個方法在活動由不可見變成可見的時候調用 */ @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); Log.d("jiejie", "MainFragment————————————————onStart"); } /** * 這個方法在活動準備好和用戶進行交互的時候調用。此時的活動一定位於返回棧的棧頂,並且處於運行的狀態 */ @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); Log.d("jiejie", "MainFragment————————————————onResume"); } /** * 這個方法在系統準備去啟動或者恢復另一個活動的時候調用。我們通常會在這個方法中 * 將一些消耗CPU的資源釋放掉,以及保存一些關鍵的數據,但這個方法的執行速度一定要快, 不然會影響到新的棧頂活動的使用。 */ @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); Log.d("jiejie", "MainFragment————————————————onPause"); } /** * 這個方法在活動完全不可見的時候調用。它和onPause()方法的主要區別在於, * 如果啟動的新活動是一個對話框的活動,那麼onPause()方法會得到執行,而onStop() 方法並不會執行 */ @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); Log.d("jiejie", "MainFragment————————————————onStop"); } /** * 這個方法在活動被銷毀之前調用,之後活動的狀態將變成銷毀狀態 */ @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); Log.d("jiejie", "MainFragment————————————————onDestroy"); } /** * 這個方法在活動由停止變為運行狀態之前調用,也是活動被重新啟動了。 */ @Override protected void onRestart() { // TODO Auto-generated method stub super.onRestart(); Log.d("jiejie", "MainFragment————————————————onRestart"); } }
1 package com.demo.text; 2 3 import com.demo.pullrefresh.R; 4 5 import android.app.Activity; 6 import android.content.Intent; 7 import android.os.Bundle; 8 import android.support.v4.app.Fragment; 9 import android.util.Log; 10 import android.view.LayoutInflater; 11 import android.view.View; 12 import android.view.ViewGroup; 13 import android.widget.Button; 14 import android.widget.Toast; 15 16 public class Fragment01 extends Fragment { 17 private Button bb_text; 18 19 @Override 20 public View onCreateView(LayoutInflater inflater, ViewGroup container, 21 Bundle savedInstanceState) { 22 // TODO Auto-generated method stub 23 // return super.onCreateView(R.layout.fragment1, container, false); 24 Log.d("jiejie", "Fragment01————onCreateView————被調用"); 25 return inflater.inflate(R.layout.fragment1, container, false); 26 // 第一個是resource ID,指明瞭當前的Fragment對應的資源文件; 27 // 第二個參數是父容器控制項; 28 // 第三個布爾值參數表明是否連接該佈局和其父容器控制項,在這裡的情況設置為false, 29 //因為系統已經插入了這個佈局到父控制項,設置為true將會產生多餘的一個ViewGroup。 30 } 31 32 // //表示activity執行onCreate方法完成了的時候會調用此方法 33 @Override 34 public void onActivityCreated(Bundle savedInstanceState) { 35 // TODO Auto-generated method stub 36 super.onActivityCreated(savedInstanceState); 37 System.out.println("1"); 38 Log.d("jiejie", "Fragment01————onActivityCreated————被調用"); 39 bb_text = (Button) getActivity().findViewById(R.id.bb_text); 40 bb_text.setOnClickListener(new View.OnClickListener() { 41 42 @Override 43 public void onClick(View arg0) { 44 // TODO Auto-generated method stub 45 // startActivity(new Intent(getActivity(), OtherClass.class)); 46 Toast.makeText(getActivity(), "------", Toast.LENGTH_SHORT) 47 .show(); 48 } 49 }); 50 } 51 52 // 當碎片和活動建立關聯的時候調用 53 @Override 54 public void onAttach(Activity activity) { 55 // TODO Auto-generated method stub 56 super.onAttach(activity); 57 Log.d("jiejie", "Fragment01————onAttach————被調用"); 58 } 59 60 // 為碎片創建視圖(載入佈局時調用) 61 @Override 62 public void onCreate(Bundle savedInstanceState) { 63 // TODO Auto-generated method stub 64 super.onCreate(savedInstanceState); 65 Log.d("jiejie", "Fragment01————onCreate————被調用"); 66 } 67 68 @Override 69 public void onStart() { 70 // TODO Auto-generated method stub 71 super.onStart(); 72 Log.d("jiejie", "Fragment01————onStart————被調用"); 73 } 74 75 @Override 76 public void onResume() { 77 // TODO Auto-generated method stub 78 super.onResume(); 79 Log.d("jiejie", "Fragment01————onResume————被調用"); 80 } 81 82 @Override 83 public void onPause() { 84 // TODO Auto-generated method stub 85 super.onPause(); 86 Log.d("jiejie", "Fragment01————onPause————被調用"); 87 } 88 89 @Override 90 public void onStop() { 91 // TODO Auto-generated method stub 92 super.onStop(); 93 Log.d("jiejie", "Fragment01————onStop————被調用"); 94 } 95 96 @Override 97 public void onDestroyView() { 98 // TODO Auto-generated method stub 99 super.onDestroyView(); 100 Log.d("jiejie", "Fragment01————onDestroyView————被調用"); 101 } 102 103 @Override 104 public void onDestroy() { 105 // TODO Auto-generated method stub 106 super.onDestroy(); 107 Log.d("jiejie", "Fragment01————onDestroy————被調用"); 108 } 109 110 // 當碎片和活動解除了關聯的時候調用 111 @Override 112 public void onDetach() { 113 // TODO Auto-generated method stub 114 super.onDetach(); 115 Log.d("jiejie", "Fragment01————onDetach————被調用"); 116 } 117 }
列印的日誌如下
剛進來時
當點擊其他的時候也就是切換fragment時
再此返回這個fragment時然後銷毀
不過這個方法每次點擊切換按鈕的時候fragment都會重新實例話這樣話會對伺服器的請求過多
2 一般都用第二種方法來實現fragment
FragmentTransaction android.support.v4.app.FragmentTransaction.add(int containerViewId, Fragment fragment)這種方法是從一開始就載入了3個fragment下麵的3個按鈕只是確定顯示哪個和隱藏哪個而已,每次點擊不會出現再次實例話
package com.demo.text; import com.demo.pullrefresh.R; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class OtherClass extends FragmentActivity implements OnClickListener { private Button btn_one, btn_two, btn_three; private Fragment01 fragment01; private Fragment02 fragment02; private Fragment03 fragment03; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.mainfragment); btn_one = (Button) findViewById(R.id.bb_one); btn_two = (Button) findViewById(R.id.bb_two); btn_three = (Button) findViewById(R.id.bb_three); btn_one.setOnClickListener(this); btn_two.setOnClickListener(this); btn_three.setOnClickListener(this); btn_one.setSelected(true); fragment01 = new Fragment01(); fragment02 = new Fragment02(); fragment03 = new Fragment03(); // 獲取fragment管理器 FragmentManager fm = getSupportFragmentManager(); // 打開事務 FragmentTransaction ft = fm.beginTransaction(); // 把內容顯示至幀佈局 // ft.replace(R.id.fl_timeshopfragment, timeLimitShop); ft.add(R.id.fl_layout, fragment01); ft.add(R.id.fl_layout, fragment02); ft.add(R.id.fl_layout, fragment03); ft.show(fragment01).hide(fragment02).hide(fragment03); // 提交 ft.commit(); } @Override public void onClick(View arg0) { // TODO Auto-generated method stub switch (arg0.getId()) { case R.id.bb_one: btn_one.setSelected(true); btn_two.setSelected(false); btn_three.setSelected(false); getSupportFragmentManager().beginTransaction().show(fragment01) .hide(fragment02).hide(fragment03).commit(); break; case R.id.bb_two: btn_one.setSelected(false); btn_two.setSelected(true); btn_three.setSelected(false); getSupportFragmentManager().beginTransaction().show(fragment02) .hide(fragment01).hide(fragment03).commit(); break; case R.id.bb_three: btn_one.setSelected(false); btn_two.setSelected(false); btn_three.setSelected(true); getSupportFragmentManager().beginTransaction().show(fragment03) .hide(fragment01).hide(fragment02).commit(); break; default: break; } } /** * 這個方法在活動由不可見變成可見的時候調用 */ @Override protected void onStart() { // TODO Auto-generated method stub super.onStart(); } /** * 這個方法在活動準備好和用戶進行交互的時候調用。此時的活動一定位於返回棧的棧頂,並且處於運行的狀態 */ @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); } /** * 這個方法在系統準備去啟動或者恢復另一個活動的時候調用。我們通常會在這個方法中 * 將一些消耗CPU的資源釋放掉,以及保存一些關鍵的數據,但這個方法的執行速度一定要快, 不然會影響到新的棧頂活動的使用。 */ @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); } /** * 這個方法在活動完全不可見的時候調用。它和onPause()方法的主要區別在於, * 如果啟動的新活動是一個對話框的活動,那麼onPause()方法會得到執行,而onStop() 方法並不會執行 */ @Override protected void onStop() { // TODO Auto-generated method stub super.onStop(); } /** * 這個方法在活動被銷毀之前調用,之後活動的狀態將變成銷毀狀態 */ @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); } /** * 這個方法在活動由停止變為運行狀態之前調用,也是活動被重新啟動了。 */ @Override protected void onRestart() { // TODO Auto-generated method stub super.onRestart(); } }
1 <?xml version="1.0" encoding="utf-8"?> 2 <selector xmlns:android="http://schemas.android.com/apk/res/android"> 3 4 <item android:state_selected="true" android:color="#f00"></item> 5 <item android:color="#000"/> 6 7 </selector>View Code