Fragment

Posted 凤雏小呆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fragment相关的知识,希望对你有一定的参考价值。

Fragment

Fragment在android3.0版本后才支持,所以需要在android3.0以前版本使用Fragment需要做特殊配置详细方法见后面

fragment在android3.0版本以后的使用方法

fragment 理解成迷你activity,依托于activity存活,如果activity挂了,fragment也挂了。

关键代码

    //得到片段的管理器
    FragmentManager fm = getFragmentManager(); 
    //利用管理器开启事务
    FragmentTransaction ft = fm.beginTransaction();
    //在事务中将帧布局用自己创建的Fragment来替换
    ft.replace(R.id.fl, new Fragment01());
    //将事务提交
    ft.commit();

第一步创建一个类来继承Fragment类

public class Fragment01 extends Fragment{

}

第二步重写fragment子类的onCreateView()方法,返回当前fragement显示的view对象。

//返回当前fragement显示的view对象。
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    //注意,需要自己为fragement01创建一个布局文件
    return View.inflate(getActivity(), R.layout.fragement01_layout, null);
}

第三步 在activity中显示fragment

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //得到片段的管理器
        FragmentManager fm = getFragmentManager(); 
        //利用管理器开启事务
        FragmentTransaction ft = fm.beginTransaction();
        //在事务中将帧布局用自己创建的Fragment来替换
        ft.replace(R.id.fl, new Fragment01());
        //将事务提交
        ft.commit();
    }
}

Fragment在低版本安卓系统的应用

需要做以下的修改

  • 使用 support-v4.jar包。包含有新版本sdk的API。

  • 替换所有的导包 android.app.* ---> android.support.v4.app.*;

  • 继承activity的时候 换成 FragmentActivity

  • getFragmentManager() --->getSupportFragmentManager();

在实际开发当中,基本上使用的都是v4包里面的fragement

代码参考下面

package a.a.a.a;

import android.os.Bundle;
//第一个需要改动的地方
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.view.View;
//第二个需要改动的地方
public class MainActivity extends FragmentActivity {

    private android.support.v4.app.FragmentTransaction ft;
    private FragmentManager fm;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void click1(View v) {
        //第三个需要改动的地方
        //获取一个Fragment管理者对象
        fm = getSupportFragmentManager();
        //利用管理者开启一个事务
        ft = fm.beginTransaction();
        //将MyFragment01替换mainactivity中的fl
        ft.replace(R.id.fl, new MyFragment01());
        //执行完后将事务提交
        ft.commit();
    }

}

fragement的生命周期

完整生命周期

oncreate-->oncreateView-->onstart-->onresume-->onpause--->onstop--->ondestroy

可视生命周期

onstart-->onresume-->onpause--->onstop

前台生命周期

onresume-->onpause

通过Fragment传递数据

通过发送广播的方式

在mainactivity中创建一个意图发送广播,在Fragment子类中创建一个广播接收者获取数据

mainactivity中代码

public void click1(View view) {
    // 保证界面更新要么成功 要么失败 开启事务
    Fragment01 f01 =  new Fragment01();
    ft = fm.beginTransaction();
    ft.replace(R.id.container,f01);
    ft.commit();
    //提交事务的时候如果还没有提交完就执行下面的子线程,就会导致数据获取不到,所以用子线程晚一点来获取就能得到数据
    new Thread(){
        public void run() {
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //发送一个广播 告诉 fragment 数据要变化了。
            String name = et_name.getText().toString().trim();
            Intent intent = new Intent();
            intent.setAction("com.itheima.fragement.change");
            intent.putExtra("name", name);
            sendBroadcast(intent);
        };
    }.start();

Fragment01类的代码

public class Fragment01 extends Fragment  {
    private TextView tv_info;

    //返回当前fragement显示的view对象。
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        System.out.println("oncreate view");
        View view =View.inflate(getActivity(), R.layout.fragement01_layout, null);
        tv_info = (TextView) view.findViewById(R.id.tv_info);
        System.out.println("tv_info:"+tv_info);
        return view;
    }

    //在执行下面代码的时候 textview的空间还没有被显示到界面上。
    public void setName(String name){
        tv_info.setText(name);
    }
    //定义一个广播接收者类
    private class MyReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            System.out.println("哈哈哈哈,广播事件到了。");
            String name = intent.getStringExtra("name");
            setName(name);
        }
    }
    private MyReceiver receiver;

    //实现Fragment01的oncreate方法
    @Override
    public void onCreate(Bundle savedInstanceState) {
        System.out.println("oncreate");
        receiver = new MyReceiver();
        //注册接收广播
        getActivity().registerReceiver(receiver, new IntentFilter("com.itheima.fragement.change"));
        super.onCreate(savedInstanceState);
    }
    @Override
    public void onDestroy() {
        getActivity().unregisterReceiver(receiver);
        receiver = null;
        System.out.println("ondestory");
        super.onDestroy();
    }

}

以上是关于Fragment的主要内容,如果未能解决你的问题,请参考以下文章

从片段中的相机拍照

后按时从 onCreate() 开始片段

RadioGroup结合RadioButton使用切换Fragment片段

Listview 项目未在 Fragment Android 中显示

当 ViewPager 中的片段出现和消失时如何执行一些代码

Cg入门20:Fragment shader - 片段级模型动态变色(实现汽车动态换漆)