欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

复习Android——Fragment

程序员文章站 2022-04-18 10:12:54
Fragment是什么Fragment是一种可以嵌入在Activity中的UI片段,它可以让程序更加合理和充分地利用大屏幕的空间。使用Fragment声明两个Fragment的布局文件:

Fragment是什么

Fragment是一种可以嵌入在Activity中的UI片段,它可以让程序更加合理和充分地利用大屏幕的空间。

使用Fragment

声明两个Fragment的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/left_frag_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="Button"/>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/right_frag_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:textSize="24sp"
        android:text="这是右边的Fragment"/>
</LinearLayout>

新建自定义的Fragment类,需要继承androidx包下的Fragment,并重写onCreateView方法,在其中绑定对应的视图文件:

public class RightFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.right_fragment, container, false);
    }
}
public class LeftFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.left_fragment, container, false);
    }
}

在其他布局文件中引入相关Fragment的布局:

<LinearLayout
              android:id="@+id/fragment_list_view"
              android:layout_width="match_parent"
              android:layout_height="0dp"
              android:layout_weight="1"
              android:orientation="horizontal">
    <fragment
              android:id="@+id/left_fragment"
              android:name="com.zcd.flcdemo.Fragments.LeftFragment"
              android:layout_weight="1"
              android:layout_width="0dp"
              android:layout_height="match_parent"/>
    <fragment
              android:id="@+id/right_fragment"
              android:name="com.zcd.flcdemo.Fragments.RightFragment"
              android:layout_weight="1"
              android:layout_width="0dp"
              android:layout_height="match_parent"/>
</LinearLayout>

通过<fragment>标签下的name属性来指定相关的Fragment类。

动态添加Fragment

创建另一个Fragment:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:textSize="24sp"
        android:text="这是另一个右边的Fragment"/>
</LinearLayout>

新建与之相关的Java类:

public class AntherRightFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.new_right_fragment, container, false);
    }
}

更改在使用处的布局文件:

<LinearLayout
              android:id="@+id/fragment_list_view"
              android:layout_width="match_parent"
              android:layout_height="0dp"
              android:layout_weight="1"
              android:orientation="horizontal">
    <fragment
              android:id="@+id/left_fragment"
              android:name="com.zcd.flcdemo.Fragments.LeftFragment"
              android:layout_weight="1"
              android:layout_width="0dp"
              android:layout_height="match_parent"/>
    <FrameLayout
                 android:id="@+id/right_layout"
                 android:layout_width="0dp"
                 android:layout_height="match_parent"
                 android:layout_weight="1"/>
</LinearLayout>

向新引用的FrameLayout中动态添加内容:

//动态添加Fragment
changeFragment = findViewById(R.id.btn_change_frag);
changeFragment.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        replaceFrag(new AntherRightFragment());
    }
});
replaceFrag(new RightFragment());

更改方法具体实现:

private void replaceFrag(Fragment fragment){
    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.replace(R.id.right_layout, fragment);
    transaction.commit();
}

动态添加Fragment主要分为以下步骤:

  • 创建一个需要添加的Fragment实例;
  • 通过调用getSupportFragmentManager方法来获取FragmentManager对象;
  • 通过获取到的Fragment对象调用beginTransaction方法获取到FragmentTransaction对象用于事务的提交;
  • 向容器中添加或者替换Fragment;
  • 调用commit方法以提交修改的事务;

将Fragment添加到返回栈

默认情况下Fragment并没有被放到返回栈中,需要手动调用方法以将其添加到返回栈中:

private void replaceFrag(Fragment fragment){
    FragmentManager manager = getSupportFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.replace(R.id.right_layout, fragment);
    transaction.addToBackStack(null);
    transaction.commit();
}

只需要调用FragmentTransaction中的addToBackStack方法即可,参数为操作的名称,常常取值为null。

Fragment生命周期

Fragment的生命周期主要有一下四个状态:

  • 运行状态

    与Fragment关联的Activity如果处于运行状态那么Fragment也处于运行状态;

  • 暂停状态

    与Fragment关联的Activity如果处于暂停状态那么Fragment也处于暂停状态;

  • 停止状态

    与Fragment关联的Activity如果处于停止状态那么Fragment也处于停止状态;

    通过FragmentTransaction的remove方法和replace方法将Fragment从Activity中移除,但是在事务提交之前调用了addToBackStack方法Fragment也会进入停止状态;

  • 销毁状态

    与Fragment关联的Activity如果处于销毁状态那么Fragment也处于销毁状态;

    通过FragmentTransaction的remove方法和replace方法将Fragment从Activity中移除,但是在事务提交之前没有调用addToBackStack方法Fragment也会进入停止状态;

其他的生命周期方法:

  • onAttach

    当Fragment和Activity建立关联时调用;

  • onCreateView

    为Fragment加载视图时调用;

  • onActivityCreated

    确保与Fragment相关联的Activity已经创建完毕时调用;

  • onDestroyView

    当与Fragment关联的视图被移除时调用;

  • onDetach

    当Fragment和Activity解除关联时调用;

Fragment的生命周期:

本文地址:https://blog.csdn.net/qq_40462579/article/details/107364214

相关标签: 学习笔记 java