• 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();
        }
    
    }
  • 相关阅读:
    python列表解析和正同表达式
    python实现屏幕截图
    pngCanvas 是一个使用纯Python代码的生成png图像的工具
    windows 7 提示升级到windows 10补丁
    openerp所用QWEB2的调试笔记
    修改 Ubuntu 13.04 LAMP 服务器端口号
    DEB方式在UBUNTU安装ODOO 8.0
    在openerp撰写消息中增加图片
    ubuntu挂载3T新硬盘并更换home分区
    MPEG-4 压缩编码标准
  • 原文地址:https://www.cnblogs.com/fengchuxiaodai/p/5314039.html
Copyright © 2020-2023  润新知