首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

会多次调用片段onCreateView,因此每次都会创建片段的新实例

基础概念

onCreateView 是 Android 中 Fragment 生命周期的一个方法,用于创建和返回该 Fragment 的视图层次结构。通常在这个方法中进行布局的初始化和视图的绑定。

为什么会出现多次调用 onCreateView

  1. 配置更改:如屏幕旋转,系统会销毁并重新创建 Activity 和其中的 Fragment。
  2. Fragment 事务:通过 FragmentManager 执行添加、替换或移除 Fragment 的操作时,可能会触发 onCreateView
  3. 内存不足:系统为了回收内存可能会销毁一些 Activity 或 Fragment,当用户返回到这些界面时,需要重新创建。

相关优势

  • 灵活性:允许开发者根据不同的条件加载不同的布局。
  • 模块化:有助于将 UI 分割成独立的模块,便于管理和复用。

类型与应用场景

  • 单例模式:确保 Fragment 实例在整个应用生命周期内只创建一次。
  • ViewModel:使用 ViewModel 来保存和管理与 UI 相关的数据,这样即使 Fragment 被销毁,数据依然可以存活。

解决方法

使用 setRetainInstance(true)

这个方法可以让 Fragment 在配置更改时保持不变,但需要注意它不适用于进程被杀死的情况。

代码语言:txt
复制
public class MyFragment extends Fragment {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        // 初始化视图
        return inflater.inflate(R.layout.fragment_my, container, false);
    }
}

使用 ViewModel

ViewModel 可以在配置更改时保持数据,避免重复创建视图。

代码语言:txt
复制
public class MyViewModel extends ViewModel {
    // 这里可以保存与UI相关的数据
}

public class MyFragment extends Fragment {
    private MyViewModel viewModel;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        viewModel = new ViewModelProvider(this).get(MyViewModel.class);
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        // 使用viewModel中的数据初始化视图
        return inflater.inflate(R.layout.fragment_my, container, false);
    }
}

避免不必要的 Fragment 事务

确保在执行 Fragment 事务时,不会不必要地重新创建 Fragment。

代码语言:txt
复制
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();

// 检查是否已经存在该Fragment实例
MyFragment myFragment = (MyFragment) fragmentManager.findFragmentByTag("MyFragmentTag");
if (myFragment == null) {
    myFragment = new MyFragment();
    transaction.add(R.id.fragment_container, myFragment, "MyFragmentTag");
} else {
    // 如果已经存在,则将其显示出来
    transaction.show(myFragment);
}

transaction.commit();

通过上述方法可以有效减少 onCreateView 被多次调用的情况,提升应用的性能和用户体验。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android入门教程 | Fragment 基础概念

onCreateView() 系统会在片段首次绘制其界面时调用此方法。如要为片段绘制界面,从此方法中返回的 View 必须是片段布局的根视图。如果片段未提供界面,可以返回 null。...创建此 Activity 布局时,系统会将布局中指定的每个片段实例化,并为每个片段调用 onCreateView() 方法,以检索每个片段的布局。...onCreateView() —— 当activity要得到fragment的layout时,调用此方法,fragment在其中创建自己的layout(界面)。...不过,只有在移除片段的事务执行期间通过调用 addToBackStack() 显式请求保存实例时,系统才会将片段放入由宿主 Activity 管理的返回栈。...通过 replace 切换 Fragment,每次都会执行上一个 Fragment 的 onDestroyView,新 Fragment的 onCreateView、onStart、onResume 方法

3.5K40

Fragment初识

由于平板电脑的屏幕比手机屏幕大得多,因此可用于组合和交换 UI 组件的空间更大。利用片段实现此类设计时,您无需管理对视图层次结构的复杂更改。...也就是说,由于每个片段都会通过各自的生命周期回调来定义其自己的布局和行为,您可以将一个片段加入多个 Activity,因此,您应该采用可复用式设计,避免直接从某个片段直接操纵另一个片段。...不过,在手机尺寸的屏幕上,没有足以储存两个片段的空间,因此Activity A 只包括用于显示文章列表的片段,当用户选择文章时,它会启动Activity B,其中包括用于阅读文章的第二个片段。...官方文档说创建Fragment时至少需要实现三个方法:onCreate( ),onCreateView( ),OnPause( ); 不过貌似只写一个onCreateView也是可以的… Fragment...Bundle数据包,调用Fragment实例的setArguments(bundle) 从而将Bundle数据包传给Fragment,然后Fragment中调用getArguments获得 Bundle

1.2K20
  • Android交流会-碎片Fragment,闲聊单位与尺寸

    onAttach(): 一旦片段与其活动相关联就被调用; onCreate(): 片段被调用创建; onCreateView(): 创建并返回相关的视图结构; onActivityCreated(...): 表示活动已被创建完成了,这里是activity创建成功; onStart(): 片段对用户可见; onResume(): 片段与用户开始交互; onPause(): 片段与用户不再交互;...()中添加即可 图片 3.创建Fragment 创建一个Fragment的子类,继承Fragmennt类,重写onCreateView()方法。...静态: 图片 动态: 动态加载步骤: 创建添加的Fragment实例; 获取FragmentManager,调用getFragmentManager()方法; 开启事务,调用beginTransaction...MyFragment myFragment = getFragmentManager().findFragmentById(R.id.fragment); 接着通过调用getActivity()方法来获取当前片段和相关联的活动实例

    1.2K20

    Android Fragment用法知识点的讲解

    适用于页面较多的情况,每次切换会回收内存的。...图片来源官方: 生命周期 onAttach(): 一旦片段与其活动相关联就被调用; onCreate(): 片段被调用创建; onCreateView(): 创建并返回相关的视图结构; onActivityCreated...(): 表示活动已被创建完成了,这里是activity创建成功; onStart(): 片段对用户可见; onResume(): 片段与用户开始交互; onPause(): 片段与用户不再交互;...onStop(): 片段不再对用户可见; onDestroyView(): 销毁与其View相关资源; onDestroy(): 销毁一切片段; onDetach(): 片段与其活动不再相关联...打开界面:onCreate() -> onCreateView()->onActivityCreated()->onStart()-> onResume() Home:onPause() -> onStop

    1K60

    Android开发笔记(六十七)嵌入页面的碎片

    设计Fragment的目的是让页面布局更加灵活,不但可以随意组装和拼接各个片段,还可以只更新某个片段实现页面局部更新的功能(这个类似网页的ajax技术)。...这样,每次获取Fragment实例,都是调用newInstance方法获得,而不是调用它的构造函数。...可在该方法实例化Activity的一个回调对象,就能在Fragment中调用Activity的回调方法,这样设计的好处是Activity无需调用set***Listener方法来设置监听器接口。...onCreateView : 创建Fragment的视图,在onCreate之后调用。...onActivityCreated : 在Activity页面创建完毕之后调用,这意味着onCreateView有可能在主页面尚未创建完毕时就完成了,比如说在主页面的onCreate方法中加入Fragment

    1.3K60

    Android面试题总结【完整详细版本”一”】(含答案)

    SingeTop:如果启动的activity已经位于栈顶,那么就不会重新创建一个新的activity实例。而是复用位于栈顶的activity实例对象。...如果不位于栈顶仍旧会重新创建activity的实例对象。...如果一个Service被多次执行startService(),它的onCreate()方法只会调用一次,也就是说该Service只会创建一个实例,而它的onStartCommand()将会被调用多次(对应调用...如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。...当该Activity启动时,系统会创建一个新的任务栈,同时将Activity放到这个新的任务栈当中,有别的应用来启动该Activity时,由于栈内复用的特性,不会再去创建相应Activity任务栈,而是这两个应用独享一个

    1.1K20

    Android之Fragment

    大屏幕如平板小屏幕如手机,平板电脑的设计使得其有更多的空间来放更多的UI组件,而多出来的空间存放UI使其会产生更多的交互,从而诞生了fragments 。   ...当一个片段指定了自身的布局时,它能和其他片段配置成不同的组合,在活动中为不同的屏幕尺寸修改布局配置(小屏幕可能每次显示一个片段,而大屏幕则可以显示两个或更多)。   ...Fragment必须被写成可重用的模块。因为fragment有自己的layout,自己进行事件响应,拥有自己的生命周期和行为,所以你可以在多个activity中包含同一个Fragment的不同实例。...Fragment提供一个新的方式让你在不同的安卓设备上统一你的UI。 Fragment 解决Activity间的切换不流畅,轻量切换。 Fragment 替代TabActivity做导航,性能更好。...Fragment对象的初始创建时,调用onCreate(Bundle)方法; 3. onCreateView(LayoutInflater, ViewGroup, Bundle)方法用于创建和返回跟Fragment

    67320

    android之Fragment介绍

    Fragment是一种可以嵌入在Activity当中的UI片段,用来组建Activity界面的局部模块, 也可以说一个Actiivty界面可以由多个Fragment组成。...Fragment的生命周期 image.png onCreateView是创建的时候调用,onViewCreated是在onCreateView后被触发的事件,前后关系 就是fragment中的onCreateView...且onStart运行时间位于onViewCreated之后 方法 含义 onAttach方法 Fragment和Activity建立关联的时候调用(获得activity的传递的值) onCreateView...方法 为Fragment创建视图(加载布局)时调用(给当前的fragment绘制UI布局,可以使用线程更新UI) onActivityCreated方法 当Activity中的onCreate方法执行完后调用...方法 Fragment和Activity解除关联的时候调用(脱离activity) 使用实例 fragment_tab.xml <?

    81620

    Fragment 基础知识

    onCreate() onCreateView() onActivityCreated() fragment新的状态。...的layout时,调用此方法,fragment在其中创建自己的layout onActivityCreated() —— 当activity的onCreated()方法返回后调用此方法 onDestroyView...: 如果我们使用replace来切换页面,那么在每次切换的时候,Fragment都会重新实例化,重新加载一边数据,这样非常消耗性能和用户的数据流量。...这是因为replace操作,每次都会把container中的现有的fragment实例清空,然后再把指定的fragment添加进去,就就造成了在切换到以前的fragment时,就会重新实例会fragment...意思是如果activity随后需要从它保存的状态中恢复,这个commit是会丢失的。因此它仅仅适用在ui状态的改变对用户来说是可以接受的。

    67720

    Android应用界面开发——Fragment(实现图书详情界面)

    Android3.0引入Fragment的初衷是为了适应大屏幕的平板电脑,由于平板电脑的屏幕比手机屏幕更大,因此可以容纳更多的UI组件,且这些UI组件之间存在交互关系。...---- Fragment代表了Activity的子模块,因此可以把Fragment理解成Activity片段。 Fragment的几个特征: Fragment总是作为Activity界面的组成部分。...ListFragment 如果开发ListFragment的子类,无须重写onCreateView()方法,只要调用ListFragment的setAdapter()方法为该Fragment设置Adapter...//创建一个新的Fragment并打开事务 Fragmentr newFragment = new ExampleFragment(); FragmentManager fragmentManager...onCreateView():每次创建、绘制该Fragment的View组件时回调该方法,Fragment将会显示该方法返回的View组件。

    2.6K20

    TabLayout+ViewPager+Fragment实现切页展示「建议收藏」

    +ViewPager+Fragment方法的使用流程: 创建存储多个Fragment实例的列表 创建PagerAdapter实例并关联到Viewpager中 将ViewPager关联到Tablayout...1.View视图加载完毕,即onCreateView()执行完成 2.当前Fragment可见,即setUserVisibleHint()的参数为true 3.初次加载,即防止多次滑动重复加载 有了这两个条件过后...Google为了避免用户因翻页而造成卡顿,采用了缓存的形式,但是其实缓不缓存,只要该Fragment会显示,都会进行Fragment创建,都会耗费相应的时间,换言之,缓存只不过将本应该在翻页时的卡顿集中在启动该...优化方案一:设置缓存页面数 viewPager.setOffscreenPageLimit(int limit) 能够有效地一次性缓存多个Fragment,这样就能够解决在之后每次切换时不会创建实例对象...中将会对rootView进行null判断,如果为null,说明还没有缓存当前的View,因此会进行过缓存,反之则直接利用。

    3.3K10

    《JavaScript 模式》读书笔记(7)— 设计模式1

    当您创建一个对象时,实际上没有其他对象与其类似,因此新对象已经是单体了。...); console.log(obj == obj2); 因此,可以认为每次在使用对象字面量创建对象的时候,实际上就正在创建一个单体,并且不涉及任何特殊语法。   ...需要Universe构造函数缓存该对象实例的this,以便当第二次调用该构造函数时能够创建并返回同一个对象。有多种选择可以实现这一目标: 可以使用全局变量来存储该实例。...在第一次调用构造函数时,他会创建一个对象,并且使得私有instance指向该对象。从第二次调用之后,该构造函数仅返回该私有变量。通过这个新的实现方式,前面所有代码片段的测试也都会按照预期运行。...对于任何其他值,甚至包括无输入的值,他都会创建一个常规的对象。   下面是该行为的一些例子和测试。

    45130

    《JavaScript 模式》读书笔记(7)— 设计模式1

    当您创建一个对象时,实际上没有其他对象与其类似,因此新对象已经是单体了。...); console.log(obj == obj2); 因此,可以认为每次在使用对象字面量创建对象的时候,实际上就正在创建一个单体,并且不涉及任何特殊语法。   ...需要Universe构造函数缓存该对象实例的this,以便当第二次调用该构造函数时能够创建并返回同一个对象。有多种选择可以实现这一目标: 可以使用全局变量来存储该实例。...在第一次调用构造函数时,他会创建一个对象,并且使得私有instance指向该对象。从第二次调用之后,该构造函数仅返回该私有变量。通过这个新的实现方式,前面所有代码片段的测试也都会按照预期运行。...对于任何其他值,甚至包括无输入的值,他都会创建一个常规的对象。   下面是该行为的一些例子和测试。

    53240

    android Fragment 的简单应用

    碎片(Fragment)是一种可以嵌入在活动中的UI片段,可以理解成一个迷你活动。...上面这里重写了Fragment的onCreateView()方法,然后在这个方法中通过LayoutInflater的inflate()方法将刚才定义的left_fragment布局动态加载进来。...在onCreateView()方法中加载了刚刚创建的another_right_fagment布局,这样就创建好了另一个碎片。...FrameLayout布局是安卓最简单的一个布局,它所有的控件都会被摆放在左上角。 如图示例 4.接下来修改MainActivity中的代码。...首先,给左侧碎片中的按钮注册了一个点击事件,然后调用replaceFragment()方法,动态的添加RightFragment这个碎片,当点击左侧碎片时,又会调用replaceFragment()方法将右侧碎片替换成

    42920
    领券