当前位置: 移动技术网 > 移动技术>移动开发>Android > 复习Android——Fragment

复习Android——Fragment

2020年07月17日  | 移动技术网移动技术  | 我要评论

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网