Fragment

静态加载Fragment

步骤;

      1、新建一个Fragment1类继承Fragment

      2、在所要加载Fragment的Activity的布局中添加<fragment/>标签,android:name=”Fragment1的命名空间“

      <fragment
        android:id="@+id/fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="com.example.fragment.fragment_static"
        />

相关视频教程:http://www.imooc.com/video/2417      http://www.imooc.com/video/2418

动态加载Fragment

步骤:

        1、同静态1步骤

        2、在Activity中采用碎片管理者的事务处理

             a) 获取碎片管理者

             b) 由碎片管理者开始事务

             c) 把所要加载的碎片添加到事务

             d)   提交事务      

相关代码:

              Fragment1 fragment1 = new Fragment1();
              FragmentManager fragmentManager = getFragmentManager();
              FragmentTransaction beginTransaction = fragmentManager.beginTransaction();
              beginTransaction.add(R.id.frame, fragment1);  //frame为fragment1的父布局
              beginTransaction.addToBackStack(null);  //处理物理返回键
              beginTransaction.commit();

相关视频教程:http://www.imooc.com/video/2419

Fragment的生命周期

    /*
     * 当Fragment被添加到Activity中时会调用,并且只调用一次
     */
    @Override
    public void onAttach(Activity activity) {
        // TODO Auto-generated method stub
        super.onAttach(activity);
        Log.i("Main", "Fragment2---onAttach()");
    
    }
    /*
     * 当创建Fragment时被调用,只会调用一次
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        Log.i("Main", "Fragment2---onCreate()");

    }
    /*
     * 当Fragment所在的Activity启动完成以后调用
     */
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);
        Log.i("Main", "Fragment2---onActivityCreated()");
    
    }
    /**
     * 启动Fragment时回调
     */
    @Override
    public void onStart() {
        // TODO Auto-generated method stub
        super.onStart();
        Log.i("Main", "Fragment2---onStart()");
    
    }
    /**
     * 回复Fragment时回调次方法,调用onStart()方法后一定会调用此方法。
     * (Fragment获取焦点时调用)
     */
    @Override
    public void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        Log.i("Main", "Fragment2---onResume()");
        
    }
    /**
     * 暂停Fragment时回调
     */
    @Override
    public void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        Log.i("Main", "Fragment2---onPause()");
    
    }
    /**
     * 停止Fragment时回调
     */
    @Override
    public void onStop() {
        // TODO Auto-generated method stub
        super.onStop();
        Log.i("Main", "Fragment2---onStop()");
        
    }
    /**
     * 销毁Fragment所包含的View组件时回调
     */
    @Override
    public void onDestroyView() {
        // TODO Auto-generated method stub
        super.onDestroyView();
        Log.i("Main", "Fragment2---onDestroyView()");

    }
    /**
     * 销毁Fragment时会被回调
     */
    @Override
    public void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        Log.i("Main", "Fragment2---onDestroy()");
    
    }
    /**
     * 把Fragment从Activity中删除时会被回调
     */
    @Override
    public void onDetach() {
        // TODO Auto-generated method stub
        super.onDetach();
        Log.i("Main", "Fragment2---onDetach()");
    }


Fragment和Activity的通信

1、Activity--〉Fragment

     Activity向静态加载的Fragment发送数据

     a) 在所要通信的Fragment中设置一个消息变量,并生成get(),set()方法

     b) 在Activity中通过FragmentManager的findViewById方法找到所要通信的布局,并通过set()方法传递数据

     c)  在Fragment的get()方法即可接收此值。

     关键代码:

       /**
         * 对静态Fragment,由Activity向Fragment传值的方法
         * 1、获取碎片管理者对象 FragmentManager(getFragmentManager())
         * 2、通过调用碎片管理者的findFragmentById(静态碎片的id)方法找到通信的碎片
         * 3、转换成你定义的碎片
         * 4、调用碎片中的方法传递你的数据
         */

        FragmentManager fragmentManager = getFragmentManager();
        Fragment findFragmentById = fragmentManager.findFragmentById(
                R.id.myFragment);
        fragment_static myFragment = (fragment_static) findFragmentById;
        myFragment.setSendText("Activity向Fragment发送数据");

       Activity向动态加载的Fragment发送数据

                /**
                 * 动态加载Fragment并向Fragment传递数据
                 * 利用bundle数据类型进行传值,
                 * 1.新建Bundle数据类型,添加所要传送的数据,创建键值对
                 * Bundle bundle = new Bundle();
                 * bundle.putString("name", text);
                 * 2.利用Fragment的setArguments(Bundle bundle);进行对碎片传值
                 * fragment4.setArguments(bundle);

                   3.在Fragment中通过getArguments().get("name")得到Actiity中传来的值

                 */           

            相关代码:

              Activity中:

               String text = editText.getText().toString();
                Fragment4 fragment4 = new Fragment4();
                Bundle bundle = new Bundle();
                bundle.putString("name", text);
                fragment4.setArguments(bundle);
                FragmentManager fragmentManager = getFragmentManager();
                FragmentTransaction beginTransaction = fragmentManager
                        .beginTransaction();
                /**
                 * 下面add()方法中的第三个参数指的是要加载的碎片的tag(标识),
                 * add()方法是把当前碎片直接加入到事务队列中,不管有没有同一标识的碎片,
                 * 碎片中组件加载时总加载最上面的那个。
                 * replace()方法是:若事务中原先有该碎片的话,先删除该碎片,然后再把当前的
                 * 碎片加入到此事务中。用新的同一标识的碎片替换原来的碎片。
                 */
                //fragmentTransaction.add(R.id.layout1,fragment4,"fragment4");
                beginTransaction.replace(R.id.layout1,fragment4,"fragment4");
                beginTransaction.addToBackStack(null);
                beginTransaction.commit();
                Toast.makeText(MainActivity4.this, "向Fragment发送数据" + text,
                               Toast.LENGTH_SHORT).show();

               Fragment中:

                 String tv = getArguments().get("name")+"";    

2、Fragment向Activity传值

     a) 在Fragment中自定义一个接口,在接口中写入传递信息的方法

     b) 在Activity中调用该接口并实现该方法  ,该方法中便可以接收Fragment传来的值

     c) 在Fragment中同过getActivity()得到所在的Actiity,并调用getActivity()的实现的接口的方法,实现传值。

     代码:

          Fragment中:

            private Listener listener;

             public interface Listener{
                  public void thanks(String text);
             }
            @Override
          public void onAttach(Activity activity){
              super.onAttach(activity);
              listener = (Listener)activity;
        
          }

          listener.thanks(thanksText);

         Activity中:

        implements Listener

         @Override
        public void thanks(String str) {
        // TODO Auto-generated method stub
        Toast.makeText(MainActivity4.this, "收到"+str, Toast.LENGTH_SHORT)
        .show();
        
    }  

相关视频: http://www.imooc.com/video/2504                                                                                              

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值