Activity生命周期:
- onCreate(Bundle savedInstanceState) :Activity 的创建阶段。在这里,您可以执行初始化操作,如设置布局、绑定视图、初始化变量等。通常,您还会检查传递给
onCreate的savedInstanceState,以查看是否需要还原之前的状态。 - onStart() :Activity 可见但不可交互。在这里,您可以执行一些初始化设置和准备工作。
- onResume() :Activity 可见且可交互。在这里,您通常会开始执行与用户交互相关的操作,如启动动画、开始传感器监听器等。
- onPause() :Activity 即将失去焦点,但仍可见。在这里,您通常会停止执行与用户交互相关的操作,以节省资源。
- onStop() :Activity 不再可见。在这里,您可以释放一些资源,停止处理后台任务,以及准备 Activity 进入后台状态。
- onSaveInstanceState(Bundle outState) :在 Activity 即将被销毁之前,用于保存当前状态的数据。这个方法允许您将数据保存到 Bundle 对象中,以便稍后在
onCreate中恢复。 - onDestroy() :Activity 即将被销毁。在这里,您可以释放任何剩余的资源、取消监听器、取消未完成的任务等清理操作。
- onRestart() :Activity 重新启动。在这里,您可以执行一些重新初始化操作,以准备 Activity 进入
onStart阶段。
Fragment生命周期
- onAttach(Context context) :Fragment 被附加到 Activity 时调用。在这里,您可以访问 Fragment 所属的 Activity,并执行一些初始化操作。
- onCreate(Bundle savedInstanceState) :在 Fragment 创建时调用。可以在这里进行一些初始化工作,但通常建议在这里只执行轻量级操作。
savedInstanceState参数用于恢复之前保存的状态。 - onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) :在此方法中,您应该创建 Fragment 的用户界面视图,并返回该视图。通常,您会使用
inflater参数从 XML 布局文件中创建视图。 - onActivityCreated(Bundle savedInstanceState) :在与 Fragment 关联的 Activity 的
onCreate方法完成后调用。可以在这里执行一些需要访问 Activity 上下文的操作。 - onStart() :Fragment 变得可见但尚未可交互时调用。通常,您会在这里初始化资源和准备数据。
- onResume() :Fragment 变得可见且可交互时调用。通常,您会在这里启动动画、开始监听事件等与用户交互相关的操作。
- onPause() :Fragment 即将失去焦点,但仍可见时调用。通常,您会在这里停止执行与用户交互相关的操作。
- onStop() :Fragment 不再可见时调用。您可以在这里释放资源、停止处理后台任务等。
- onDestroyView() :在 Fragment 的视图被销毁时调用。在这里,您可以清理与视图相关的资源,但 Fragment 实例本身仍然保留。
- onDestroy() :在 Fragment 即将被销毁时调用。通常,在这里执行最后的清理操作。
- onDetach() :在 Fragment 与 Activity 解除关联时调用。在这里,您可以执行最后的清理操作,并且不能再访问 Activity。
Fragment 是 Android 中的一种组件,它表示 Activity 的一部分用户界面或行为。Fragment 可以视为一个小型的子 Activity,它可以嵌入到 Activity 中,允许您构建更灵活和模块化的用户界面。Fragment 的主要作用包括:
- 模块化用户界面:Fragment 允许您将用户界面分成可重用的模块。这使得更容易构建适应不同屏幕尺寸和设备方向的应用程序。
- 多窗格用户界面:Fragment 可以用于构建支持平板电脑和大屏幕设备上的多窗格用户界面,其中多个 Fragment 可以同时显示在一个 Activity 中。
- 交互和通信:Fragment 可以与其宿主 Activity 以及其他 Fragment 进行通信。这使得在应用程序中的不同部分之间传递数据和触发操作变得容易。
- 生命周期管理:Fragment 具有自己的生命周期,与 Activity 的生命周期相似,可以处理各种生命周期事件,如创建、销毁、暂停和恢复。
- 动态添加和替换:您可以在运行时动态添加、替换和删除 Fragment,以响应用户操作或应用程序需求的变化。
- 适应屏幕方向和屏幕大小:通过使用 Fragment,您可以更容易地处理设备方向变化和不同屏幕大小的适配,从而提供更好的用户体验。
一、Fragment相关例子:
- 创建两个 Fragment 类。在项目中创建两个 Fragment 类,例如
FragmentA和FragmentB。
// FragmentA.java
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
public class FragmentA extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_a, container, false);
// 添加按钮点击事件,用于替换到 FragmentB
Button button = view.findViewById(R.id.buttonToB);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MainActivity mainActivity = (MainActivity) getActivity();
mainActivity.replaceFragment(new FragmentB());
}
});
return view;
}
}
// FragmentB.java
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
public class FragmentB extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_b, container, false);
// 添加按钮点击事件,用于返回到 FragmentA
Button button = view.findViewById(R.id.buttonToA);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MainActivity mainActivity = (MainActivity) getActivity();
mainActivity.replaceFragment(new FragmentA());
}
});
return view;
}
}
- 创建布局文件来显示 Fragment 内容。在
res/layout目录下创建两个布局文件,例如fragment_a.xml和fragment_b.xml。
<!-- fragment_a.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Fragment A"
android:textSize="24sp" />
<Button
android:id="@+id/buttonToB"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Go to Fragment B" />
</LinearLayout>
<!-- fragment_b.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Fragment B"
android:textSize="24sp" />
<Button
android:id="@+id/buttonToA"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Go to Fragment A" />
</LinearLayout>
- 创建一个 Activity 来托管这两个 Fragment。
// MainActivity.java
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 添加 FragmentA 到 activity_main.xml 中的 fragmentContainer
addFragment(new FragmentA());
}
// 添加 Fragment
public void addFragment(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.fragmentContainer, fragment);
fragmentTransaction.commit();
}
// 替换 Fragment
public void replaceFragment(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragmentContainer, fragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
}
- 在
activity_main.xml布局文件中添加一个FrameLayout用于容纳 Fragment。
<!-- activity_main.xml -->
<FrameLayout
android:id="@+id/fragmentContainer"
android:layout_width="match_parent"
android:layout_height="match_parent" />
二、Fragment增加,替换,与删除:
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 添加 FragmentA 到 activity_main.xml 中的 fragmentContainer
addFragment(new FragmentA());
}
// 添加 Fragment
private void addFragment(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// 用于将 Fragment 添加到容器中(fragmentContainer)
fragmentTransaction.add(R.id.fragmentContainer, fragment);
// 可选:添加到返回栈,以便可以通过返回按钮撤消操作
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
// 替换 Fragment
private void replaceFragment(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// 用于替换容器中的当前 Fragment
fragmentTransaction.replace(R.id.fragmentContainer, fragment);
// 可选:添加到返回栈
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
// 删除 Fragment
private void removeFragment(Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// 用于从容器中删除 Fragment
fragmentTransaction.remove(fragment);
// 可选:添加到返回栈
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
// 示例:在按钮点击事件中添加一个新的 FragmentB
public void onAddFragmentBClick(View view) {
addFragment(new FragmentB());
}
// 示例:在按钮点击事件中替换当前 FragmentA 为 FragmentC
public void onReplaceWithFragmentCClick(View view) {
replaceFragment(new FragmentC());
}
// 示例:在按钮点击事件中删除当前 Fragment
public void onRemoveFragmentClick(View view) {
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragmentContainer);
if (fragment != null) {
removeFragment(fragment);
}
}
}