一、Fragment介绍
Fragment 是 Android 平台上的一种 UI 组件,用于构建灵活且可复用的界面模块。每个 Fragment 都有自己的生命周期,可以嵌入到 Activity 中,并在一个 Activity 内部管理其自己的布局和行为。通过使用 Fragment,可以实现更加模块化和灵活的应用程序设计,提高代码的可重用性和可维护性。
Fragment 具有以下特点和优势:
-
模块化:Fragment 可以作为 Activity 的独立模块存在,使得应用程序的 UI 可以更细粒度地进行设计和组织。多个 Fragment 可以在同一个 Activity 中共存,实现更复杂的界面和交互效果。
-
生命周期:Fragment 拥有自己的生命周期,与包含它的 Activity 分开管理。这意味着可以在 Fragment 的生命周期方法中执行特定的操作,例如在创建、销毁和暂停时进行相应的处理。
-
布局灵活性:每个 Fragment 都可以拥有自己的布局文件,通过组合和嵌套 Fragment,可以实现灵活多样的用户界面布局。
-
通信与交互:Fragment 可以通过 Activity 传递数据和事件,也可以与其他 Fragment 进行通信。这种通信可以通过接口回调、共享 ViewModel 等方式实现。
-
适配性:通过使用 Fragment,可以更好地适应不同尺寸的屏幕和设备。可以根据屏幕大小和方向动态加载、替换或隐藏特定的 Fragment,以提供最佳的用户体验。
二、Fragment的使用方式
运行 Fragment 的静态添加和动态添加是两种常见的方式,用于在 Activity 中加载和展示 Fragment。
(一)、Fragment静态添加:
静态添加是指在 Activity 的布局文件中直接声明 Fragment,并与相应的布局容器关联。在静态添加的情况下,Fragment 的生命周期与 Activity 的生命周期紧密相关,它们的创建和销毁是由 Activity 控制的。
静态添加例子:
FirstFragment :
package com.example.fragmentdemo;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class FirstFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_first, container, false);
}
}
MainActivity:
package com.example.fragmentdemo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
main_activity:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
tools:context=".MainActivity">
<androidx.fragment.app.FragmentContainerView
android:id="@+id/fragmentContainerView"
android:name="com.example.fragmentdemo.FirstFragment"
android:layout_width="410dp"
android:layout_height="425dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
fragment_first:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".FirstFragment">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="25sp"
android:text="我是第一个Fragment" />
</FrameLayout>
静态添加的总结:
静态添加的步骤如下:
- 在 Activity 的布局文件中添加
<fragment>
标签,并指定该标签的android:name
属性为目标 Fragment 的完整类名。 - 可以使用其他属性来配置 Fragment,例如指定
android:layout_width
和android:layout_height
来决定 Fragment 在布局中的大小和位置。
(二)、Fragment动态添加:
动态添加是指在运行时通过代码将 Fragment 动态添加到 Activity 中。与静态添加不同,动态添加提供了更大的灵活性,可以根据需要在特定的时机添加或移除 Fragment。
Fragment动态添加例子:
MainActivity :
package com.example.fragmentdemo;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 创建一个 Fragment 实例
SecondFragment fragment = new SecondFragment();
// 获取 FragmentManager
FragmentManager fragmentManager = getSupportFragmentManager();
// 开启事务
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// 将 Fragment 添加到容器
fragmentTransaction.add(R.id.container, fragment, "myFragment");
// 提交事务
fragmentTransaction.commit();
// 找到按钮视图并设置点击事件监听器
Button btnSwitch = findViewById(R.id.btnSwitch);
btnSwitch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 创建一个 FirstFragment 实例
FirstFragment firstFragment = new FirstFragment();
// 开启新的事务
FragmentTransaction switchTransaction = fragmentManager.beginTransaction();
// 替换当前的 Fragment
switchTransaction.replace(R.id.container, firstFragment);
// 提交事务
switchTransaction.commit();
}
});
}
}
FirstFragment 和SecondFragment 代码和布局跟上面的静态添加一样
Fragment动态的添加总结:
动态添加的步骤如下:
- 在 Activity 中定义一个 FragmentTransaction 对象,用于管理 Fragment 的添加、替换和移除操作。
- 使用 FragmentManager 获取 FragmentTransaction 对象。
- 调用 FragmentTransaction 的
add()
方法,将目标 Fragment 添加到 Activity 中,并指定一个容器视图的 ID,该 ID 对应于布局文件中的一个 View。 - 最后,调用 FragmentTransaction 的
commit()
方法提交事务,使得添加操作生效。