Android Fragment的介绍与使用

2019-05-22  本文已影响0人  dashingqi

简介

Fragment的生命周期

Fragment的加载方式

  1. 布局中添加Fragment
  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="horizontal"
  tools:context=".MainActivity">

  <fragment
      android:id="@+id/mFragmentOne"
      android:name="wanandroidqi.dashingqi.com.fragmentdemoproject.OneFragment"
      android:layout_width="0dp"
      android:layout_height="match_parent"
      android:layout_weight="1" />

  <fragment
      android:id="@+id/mFragmentSecond"     
      android:name="wanandroidqi.dashingqi.com.fragmentdemoproject.SecondFragment"
      android:layout_width="0dp"
      android:layout_height="match_parent"
      android:layout_weight="1" />
</LinearLayout>
  1. 在Activity.java 里面动态加载Fragment
  1. Fragment的两种引用

    由于Fragment是在Android3.0加入的,目前Android中提供v4包下的和android.app.Fragment这两种,由于是Android3.0之前加入的,在之前的版本中不能使用android.app.Fragment,要使用v4包下的兼容性的Fragment,这也是目前推荐使用。

    • v4包下的兼容性Fragment(推荐使用)
      1. v4包下的Fragment加载
      // 此时只能去加载继承至v4包下的Fragment
      // FragmentManager的实例获取是通过getSupportFragmentManager。
      private void loadFragment(){
         //获取到FragmentManager的实例
         FragmentManager fragmentManager = getSupportFragmentManager();
         //开启事物
         FragmentTransaction transaction = fragmentManager.beginTransaction();
         //将Fragment添加到FrameLayout布局中。其中SecondFragment extends v4.Fragment
         transaction.add(R.id.mContainerView,secondFragment);
         //提交事物
         transaction.commit();
       }
      
    • 系统本身内置的Fragment ,不兼容Android3.0以前的手机。
      1. 系统本身内置Fragment的加载。
         1. 只能加载系统内置的Fragment
         2. FragmentManager的实例获取是通过getFragmentManager。
         private void loadFragment() {
               android.app.FragmentManager manager = getFragmentManager();
               android.app.FragmentTransaction transaction1 = manager.beginTransaction();
               //其中ONeFragment extends android.app.Fragment
               transaction1.add(R.id.mContainerView, oneFragment);
               transaction1.commit();
           }
         
      

Fragment与Activity之间的通信方式

Activity传递数据到Fragment中
  //在Fragment中构造带有参数的Fragment
  public static SecondFragment newInstance(String data) {
      SecondFragment secondFragment = new SecondFragment();
      Bundle bundle = new Bundle();
      bundle.putString("flag", data);
      secondFragment.setArguments(bundle);
      return secondFragment;
  }
//在Activity中加入带有参数的Fragment
 private void loadFragment() {
      SecondFragment secondFragment = SecondFragment.newInstance("dashingqi");
      FragmentManager manager = getSupportFragmentManager();
      FragmentTransaction transaction = manager.beginTransaction();
      transaction.add(R.id.mContainerView, secondFragment);
      transaction.commit();
  }
 //在Fragment中获取参数
public void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      Bundle bundle = getArguments();
      data = bundle.getString("flag");
  }
 //1. 在事物中添加Fragment时 为添加的Fragment设置一个Tag
   transaction.add(R.id.mContainerView, secondFragment, "secondFragment");
 //2. 在Fragment中体格一个方法用来调用传递数据
   public void setData(String data) {
       mTvText.setText(data);
   }
 //3. 在Activity中调用findFragmentByTag,后去到Fragment的实例然后嗲用方法传递数据。
 econdFragment secondFragment = (SecondFragment) manager.findFragmentByTag("secondFragment");
 secondFragment.setData("婷婷");
Fragment传递数据到Activity中
//1. Activity实现接口,实现方法
//2. Fragment中获取到Activity实例,调用接口方法
  @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        activity = (MainActivity) getActivity();
    }

mTvText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                activity.setMessage("callback");
            }
        });
//这个地方在Fragment可以设置方法通过传递Callback实例来调用回调方法。

Fragment与Fragment之间通信
1. SecondFragment 中传数据到OneFragment
2. 在SecondFragment声明一个接口,在Activity中实现这个接口,然后在Activity中获取到OneFragment的实例,调用OneFragment中的方法,将数据传递给OneFragment。
3. 其实就是通过Activity这个中间人,将数据传递到目标Fragment。
  1. 声明一个广播,注册监听广播(在接受数据的Fragment中)
  2. 发送广播,发送带有数据的Intent,这个Intent的Action要与注册广播声明时的Action要一致。

问题记录

生命周期
上一篇 下一篇

猜你喜欢

热点阅读