Android_Fragment

Fragment:

   简单来说,Fragment其实可以理解为一个具有自己生命周期的控件,只不过这个控件又有点特殊,它有自己的处理输入事件的能力,有自己的生命周期,又必须依赖于Activity,能互相通信和托管。

fragment VS activity
  1.Fragment是android 3.0后在出项的
  2.一个activity可以运行多个Fragment
  3.Fragment不能脱离activity独立存在
  4.activiy是屏幕的主体,Fragment只是activity的组成元素

fragment和activity一样也具有生命周期,

  Fragment的生命周期是依赖于activity的,不能脱离activity而独立存在;

1.fragment的静态加载

直接在xml布局文件中进行加载

  <fragment
        android:id="@+id/listFragment"
        android:name="com.example.fragment_test.ListFragment"
        android:layout_width="204dp"
        android:layout_height="0dp"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginTop="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.151"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.0"
        />

  android:name  属性是Fragment类所在的全路径

2.Fragment的动态加载

  使用Java代码进行加载获取FragmentManager(获取管理器)----->beginTranaction(开启事物)---->add(添加Fragment)---->commit(提交)  不提交前面就白费了

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //动态加载fragment
//      1.在MainActivity的布局文件中给Fragment提供一个布局容器
//      2.创建Fragment对象
//      3.将Fragment与容器关联
        ListFragment listFragment = new ListFragment();
        //添加
        getSupportFragmentManager()
                .beginTransaction()
                .add(R.id.linear1,listFragment)
                .commit();
     /*   getSupportFragmentManager()
                .beginTransaction()
                .add(R.id.linear2,new ListFragment())//同一个Fragment 只能和一个容器相互关联,所里这里需要new一个
                .commit();*/
        getSupportFragmentManager()
                .beginTransaction()
                .add(R.id.linear2,ListFragment.instance("功夫足球"))
                .commit();
        listFragment.setTextChange(this);
    }

        //移除remove 替换replace等方法
      /*  getSupportFragmentManager()
                .beginTransaction()
                .remove(listFragment)
                .commit();*/

3.Fragment的传值问题

  activity向fragment传递数据:使用setArgument()方法,将数据写入一个Bundle中进行传递

 public static ListFragment instance(String text){
        ListFragment listFragment = new ListFragment();
        Bundle bundle = new Bundle();
        bundle.putString("name",text);
        listFragment.setArguments(bundle);
        return  listFragment;
    }
  @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(getArguments() != null){
            str = getArguments().getString("name");
        }

    }

4.Fragment向activity传值

  主要是采用接口回调

在Fragment类中创建一个借口,声明一个接口类型的成员属性,生成set()方法

  //创建set方法
    public void setTextChange(TextChange textChange) {
        this.textChange = textChange;
    }
    //定义变量
    TextChange textChange;
    //创建接口
    public interface TextChange{
        void change(String str);
    }

将所要传递的数据利用参数进行传递,我这里传递的一个String类型的,

  if(textChange != null){
                    textChange.change("我是英俊的标题");
                }

最后让activity实现这个接口,并重写方法,这时候传进来的参数(str)就是传递的数据

   @Override
    public void change(String str) {
        setTitle(str);
    }

猜你喜欢

转载自www.cnblogs.com/conglingkaishi/p/9346382.html
今日推荐