Fragment

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

这种方法是从一开始就加载了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
原文地址:https://www.cnblogs.com/wangfengdange/p/5133920.html