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

2018-08-24  本文已影响15人  liys_android

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

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

 <fragment
        android:id="@+id/myFragment"
        android:name="com.liys.fragment.MyFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

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

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

    <LinearLayout
        android:id="@+id/myFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" />

(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()
上一篇 下一篇

猜你喜欢

热点阅读