如图是效果图 我在下面定义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>