6. android 号称第五大组件 Fragment 解析

一. Fragment加载到Activity的2种方式

1.静态加载:直接在Activity布局文件中指定Fragment。使用指定属性name即可,代码如下所示:

 

注意: 这里必须加个id,不然会报错。

2. 动态加载: 动态加载需要使用到FragmentManager (推荐使用)
(1) .xml布局

    

(2) Activity中

FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        MyFragment myFragment = new MyFragment();
        transaction.add(R.id.myFragment, myFragment);
        transaction.commit();

二. Fragment的通信

1. Activity 传值给 Fragment

方法1:直接通过在Activity中的Fragment对象调用里面的方法

Fragment中定义public方法

    public void setTitle(String title){
        this.mTitle = title;
    }

Activity中调用

    MyFragment myFragment = new MyFragment();
    myFragment.setTitle("value");

方法2:通过Bundle传递

Activity中添加数据

        MyFragment myFragment = new MyFragment();
        Bundle bundle = new Bundle();
        bundle.putString("key", "value");
        myFragment.setArguments(bundle);

Fragment中接收数据

@Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        //获取数据
        Bundle bundle = getArguments();
        String str = bundle.getString("key");

        View view = inflater.inflate(R.layout.fragment, null); 
        return view;
    }
2. Fragment 传值给 Activity

方法1:通过强转getActivity()

Activity中定义接收值的方法

    public void setTitle(String title){
        this.mTitle = title;
    }

Fragment中

   @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        
        Activity activity = getActivity();
        if(activity instanceof  MainActivity){
            MainActivity mainActivity = (MainActivity)activity;
            mainActivity.setTitle("哈哈");
        }
    }

缺点:多个Activity调用的时候需要加判断,不然强转会出错。

方法2:通过接口回调的方式
Fragment中定义接口

    @SuppressLint("ValidFragment")
    public MyFragment(CallBack callBack){
        this.mCallBack = callBack;
    }

    interface CallBack{
        void setTitle(String tilte);
    }

    public void test(){
        //开始调用
        if(mCallBack != null){
            mCallBack.setTitle("haha");
        }
    }

Activity中 实现这个接口,重写setTitle()

public class MainActivity extends AppCompatActivity implements MyFragment.CallBack {

    public void addFragment(){
       ...
        MyFragment myFragment = new MyFragment(this);
       ...
    }

    @Override
    public void setTitle(String title){
        this.mTitle = title;
    }
3. Fragment 传值给 Fragment

方法:通过共用的Activity为中介传递

4. 通用方法
  1. 第三方库,Eventbus。
  2. 广播

三. Fragment和Activity生命周期的关系

我们先来看一张Google官方的图片:


Fragment生命周期.png

咋一听,Activity生命周期有七个方法,Fragment生命周期有十一个方法,貌似挺复杂的,其实我们只需要明白到底是谁带领着谁去执行生命周期的方法,就能很快弄明白这个问题。

1.打开应用

Activity Fragment
onCreate() onAttach()
onCreate()
onCreateView()
onActivityCreated()
onStart() onStart()
onResume() onResume()

2. 按下主屏幕键/锁屏

Activity Fragment
onPause() onPause()
onStop() onStop()

3. 重新打开应用

Activity Fragment
onRestart()
onStart() onStart()
onResume() onResume()

4. 按下后退键

Activity Fragment
onPause() onPause()
onStop() onStop()
onDestroy() onDestroyView()
onDestroy()
onDetach()

你可能感兴趣的:(6. android 号称第五大组件 Fragment 解析)