Android中Fragment的生命周期与返回栈的管理

那么让我们来详细讲解一下“Android中Fragment的生命周期与返回栈的管理”的完整攻略。

什么是Fragment

Fragment是Android系统中重要的UI组件,它可以看做是一个子Activity,被设计成可嵌入在Activity中的组件。和Activity一样,Fragment也有自己的生命周期,包括onCreate、onCreateView、onResume等方法。并且,一个Activity可以同时包含多个Fragment。

Fragment的生命周期

Fragment的生命周期包含以下几种状态:

  • 初始化(Instantiation):创建Fragment实例,即调用构造器。
  • 加载(onAttach):Fragment依附到Activity上,此时可以通过getActivity()方法获取Activity实例。
  • 创建(onCreate):Fragment正在创建,可以通过savedInstanceState获取之前保存的状态。
  • 填充(onCreateView):创建或者加载Fragment对应的View。
  • 就绪(onViewCreated):View创建完成,可以在该方法中进行findViewById等View操作。
  • 开始(onStart):Fragment开始运行。
  • 暂停(onPause):Fragment暂停。
  • 停止(onStop):Fragment停止运行。
  • 销毁(onDestroyView):清理View资源。
  • 销毁(onDestroy):清理Fragment资源。
  • 分离(onDetach):Fragment与Activity分离。

返回栈的管理

在Activity中,我们可以通过Intent来进行Activity之间的跳转,从而实现Activity栈的管理;而在Fragment中,我们常常需要使用FragmentManager来管理Fragment栈。

FragmentManager提供了以下几个常用的方法:

  • add(int containerViewId, Fragment fragment, String tag):添加一个Fragment到栈中。
  • remove(Fragment fragment):从栈中移除一个Fragment。
  • findFragmentById(int fragmentId):通过ID查找一个Fragment。
  • popBackStack():出栈一个Fragment。
  • popBackStackImmediate():立即出栈一个Fragment。

此外,FragmentManager还提供了一些其他的方法,例如beginTransaction、commit等来对Fragment进行管理。

示例说明

我们来考虑以下两个使用示例:

示例1

在Activity中,我们添加了一个按钮,点击按钮会添加一个Fragment(对应的布局文件为fragment_test)到栈中:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = findViewById(R.id.btn_add);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Fragment testFragment = new TestFragment();
                getSupportFragmentManager()
                        .beginTransaction()
                        .add(R.id.fragment_container, testFragment, "TEST")
                        .addToBackStack("TEST")
                        .commit();
            }
        });
    }
}

在Fragment中,我们重写了生命周期方法,并添加了打印信息的代码,方便我们观察生命周期的变化:

public class TestFragment extends Fragment {

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        Log.d("TestFragment", "onAttach");
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("TestFragment", "onCreate");
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        Log.d("TestFragment", "onCreateView");
        return inflater.inflate(R.layout.fragment_test, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        Log.d("TestFragment", "onViewCreated");
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.d("TestFragment", "onResume");
    }

    @Override
    public void onPause() {
        super.onPause();
        Log.d("TestFragment", "onPause");
    }

    @Override
    public void onStop() {
        super.onStop();
        Log.d("TestFragment", "onStop");
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        Log.d("TestFragment", "onDestroyView");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d("TestFragment", "onDestroy");
    }

    @Override
    public void onDetach() {
        super.onDetach();
        Log.d("TestFragment", "onDetach");
    }
}

此时,我们运行代码,并点击按钮添加Fragment后,可以观察到生命周期变化的日志信息:

onAttach
onCreate
onCreateView
onViewCreated
onResume

随后,我们点击返回按钮,将Fragment出栈。此时的日志信息如下:

onPause
onStop
onDestroyView
onDestroy
onDetach

示例2

在Activity中,我们添加了两个按钮,分别用于添加不同的Fragment(对应的布局文件为fragment_test1和fragment_test2)。其中,第一个Fragment添加时不加入返回栈,而第二个Fragment添加时加入返回栈。

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button1 = findViewById(R.id.btn_add1);
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Fragment testFragment = new TestFragment1();
                getSupportFragmentManager()
                        .beginTransaction()
                        .replace(R.id.fragment_container, testFragment, "TEST1")
                        .commit();
            }
        });

        Button button2 = findViewById(R.id.btn_add2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Fragment testFragment = new TestFragment2();
                getSupportFragmentManager()
                        .beginTransaction()
                        .replace(R.id.fragment_container, testFragment, "TEST2")
                        .addToBackStack("TEST2")
                        .commit();
            }
        });
    }
}

与上一个示例类似,我们同样重写了生命周期方法,并添加了打印信息的代码:

public class TestFragment1 extends Fragment {

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        Log.d("TestFragment1", "onAttach");
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("TestFragment1", "onCreate");
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        Log.d("TestFragment1", "onCreateView");
        return inflater.inflate(R.layout.fragment_test1, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        Log.d("TestFragment1", "onViewCreated");
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.d("TestFragment1", "onResume");
    }

    @Override
    public void onPause() {
        super.onPause();
        Log.d("TestFragment1", "onPause");
    }

    @Override
    public void onStop() {
        super.onStop();
        Log.d("TestFragment1", "onStop");
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        Log.d("TestFragment1", "onDestroyView");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d("TestFragment1", "onDestroy");
    }

    @Override
    public void onDetach() {
        super.onDetach();
        Log.d("TestFragment1", "onDetach");
    }
}
public class TestFragment2 extends Fragment {

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        Log.d("TestFragment2", "onAttach");
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("TestFragment2", "onCreate");
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        Log.d("TestFragment2", "onCreateView");
        return inflater.inflate(R.layout.fragment_test2, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        Log.d("TestFragment2", "onViewCreated");
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.d("TestFragment2", "onResume");
    }

    @Override
    public void onPause() {
        super.onPause();
        Log.d("TestFragment2", "onPause");
    }

    @Override
    public void onStop() {
        super.onStop();
        Log.d("TestFragment2", "onStop");
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        Log.d("TestFragment2", "onDestroyView");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d("TestFragment2", "onDestroy");
    }

    @Override
    public void onDetach() {
        super.onDetach();
        Log.d("TestFragment2", "onDetach");
    }
}

此时,我们运行代码,并先点击第一个按钮添加Fragment1,再点击第二个按钮添加Fragment2。随后,我们点击返回按钮,将Fragment2出栈,然后观察Fragment1的日志信息:

onAttach
onCreate
onCreateView
onViewCreated
onResume

可以发现,即使将Fragment2出栈,Fragment1的生命周期依然会继续。而如果我们此时再次点击返回按钮,将Fragment1出栈,就可以看到Fragment1的完整生命周期:

onPause
onStop
onDestroyView
onDestroy
onDetach

至此,关于Fragment的生命周期与返回栈的管理的攻略就讲解完了,希望对大家有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android中Fragment的生命周期与返回栈的管理 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 如何禁止修改ip地址?

    如何禁止修改IP地址攻略 禁止修改IP地址可以帮助保护网络的安全性和稳定性。下面是一些步骤和示例说明,以帮助你实施这一措施。 步骤1:使用静态IP地址 使用静态IP地址可以防止用户轻易修改其IP地址。静态IP地址是在网络设置中手动配置的,而不是通过DHCP自动分配的。以下是如何设置静态IP地址的示例说明: 打开计算机的网络设置。 找到当前网络连接的设置选项。…

    other 2023年7月30日
    00
  • oracle数据库io异常 错误代码17002解决办法

    Oracle数据库IO异常 错误代码17002解决办法 在使用Oracle数据库时,有时候可能会遇到IO异常的问题,错误代码为17002。这个错误一般是由于网络传输过程中发生错误导致的,可能是由于网络连接不稳定或服务器负荷过大等原因引起的。本文将介绍如何解决这个问题。 1. 检查网络连接和服务器负荷 在遇到这个问题时,首先需要检查一下网络连接和服务器负荷。可…

    其他 2023年3月28日
    00
  • 群辉dsvideo(station)自动同步视频简介和海报

    群辉DS Video (Station)自动同步视频简介和海报的完整攻略 群辉DS Video (Station)是一款用于管理和播放视频的应用程序。在DS Video中,可以使用自动同步功能将视频简介和海报从TheDB或TheTVDB等在线数据库中自动获取。以下是使用自动同步功能同步视频简介和海报的完整攻略。 步骤1:启用自动同步功能 首先,需要启用自动同…

    other 2023年5月8日
    00
  • backgroundimage拉伸

    以下是使用CSS中的background-image属性进行拉伸的完整攻略,包含两个示例: 步骤1:设置background-image属性 在CSS中,您可以使用background-image属性来设置元素的背景图像。要拉伸背景图像,您需要将background-size属性设置为“cover”或“100% 100%”。 以下是设置background-…

    other 2023年5月6日
    00
  • Spring MVC4.1服务器端推送实现过程解析

    Spring MVC4.1服务器端推送实现过程解析 简介 Spring MVC 4.1 中提供了 WebSocket 的支持,支持从服务器端主动向客户端推送数据。本篇文章将详细介绍 Spring MVC 4.1 实现服务器端推送的过程。 实现步骤 步骤一、添加依赖 首先,在 pom.xml 中添加 Spring WebSocket 的依赖: <depe…

    other 2023年6月27日
    00
  • 使用Netty搭建服务端和客户端过程详解

    “使用Netty搭建服务端和客户端过程详解”是一篇针对Netty初学者的教程,旨在介绍如何使用Netty框架来实现服务端和客户端的通信。本教程将详细阐述如何使用Netty搭建服务端和客户端,包括如下几个方面: Netty框架的基本介绍:介绍Netty的基本概念并简单介绍Netty的几个核心组件和它们的作用。 创建服务端:介绍如何在Netty框架下创建一个服务…

    other 2023年6月25日
    00
  • thinkphp多层MVC用法分析

    ThinkPHP多层MVC用法分析 什么是多层MVC架构 多层MVC架构是指在基本的MVC(Model-View-Controller)架构基础上,增加了service层或者business层,旨在实现业务逻辑与表现逻辑的分离,并且增加了复杂业务逻辑的封装与重用。相较于传统的二层架构,多层MVC架构可以更好的优化系统架构,增强系统的可读性、可扩展性和可维护性…

    other 2023年6月27日
    00
  • wgan-gp实战

    下面是关于“wgan-gp实战”的完整攻略: 1. 什么是WGAN-GP WGAN-GP是一种生成对抗网络(GAN)的变体,它使用梯度惩罚来替代传统GAN中的判别器损失函数。WGAN-GP的全称是Wasserstein GAN with Gradient Penalty,它的目标是训练一个生成器网络,使其能够生成与真实数据分布相似的样本。 2. WGAN-G…

    other 2023年5月7日
    00
合作推广
合作推广
分享本页
返回顶部