Android之Fragment 跳转返回重复加载重复执行onCreateView的四种解决方法

这篇具有很好参考价值的文章主要介绍了Android之Fragment 跳转返回重复加载重复执行onCreateView的四种解决方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言: 

Fragment 跳转返回重复加载重复执行 onCreateView 的问题通常是因为 Fragment 生命周期方法的调用顺序和使用不当所导致的。

1,onSaveInstanceState()方法

一种解决方法是在 Fragment 中使用 onSaveInstanceState() 方法保存 Fragment 的状态,并在 onCreate() 方法中进行状态恢复,避免重复执行 onCreateView()。具体步骤如下:

  1. 在 Fragment 中重写 onSaveInstanceState(Bundle outState) 方法,将状态信息保存到 Bundle 对象中。
  2. 在 Fragment 的 onCreate() 方法中检查 savedInstanceState 对象是否为 null,如果不是,则从 savedInstanceState 中恢复状态信息。
  3. 在 onCreateView() 方法中判断是否已存在 UI 视图,如果已经存在则不需要重新创建,直接返回缓存的视图即可。

示例代码如下:

public class MyFragment extends Fragment {
    private View rootView;
    private boolean isViewCreated = false;
    private boolean isDataLoaded = false;

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBoolean("isDataLoaded", isDataLoaded);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (savedInstanceState != null) {
            isDataLoaded = savedInstanceState.getBoolean("isDataLoaded");
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        if (rootView == null) {
            rootView = inflater.inflate(R.layout.fragment_my, container, false);
            isViewCreated = true;
        } else {
            isViewCreated = false;
            ViewGroup parent = (ViewGroup) rootView.getParent();
            if (parent != null) {
                parent.removeView(rootView);
            }
        }

        if (!isDataLoaded) {
            loadData();
        }

        return rootView;
    }

    private void loadData() {
        // 加载数据的操作
        isDataLoaded = true;
    }
}

2,使用Fragment 的 replace() 方法进行跳转,而不是使用 add() 方法

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.container, new MyFragment());
transaction.addToBackStack(null);
transaction.commit();

3,使用标识:hasInitialized

在Fragment的onCreateView中进行数据的初始化和界面的更新等操作时,需要先判断之前是否已经进行过相关操作,如果已经操作过则不需要再次执行,可以通过增加标记变量来实现。

public class MyFragment extends Fragment {
    private boolean hasInitialized = false;
    private TextView mTextView;
    private View mView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (!hasInitialized) {
            mView = inflater.inflate(R.layout.fragment_my, container, false);
            mTextView = (TextView) mView.findViewById(R.id.tv_content);
            initData();
            hasInitialized = true;
        }
        return mView;
    }

    private void initData() {
        // 如果之前没有初始化过数据,则初始化并显示
        // 如果已经初始化过了,则不需要再次初始化
        if (TextUtils.isEmpty(mTextView.getText())) {
            mTextView.setText("这是我的Fragment");
        }
    }
}

4,rootview是否已存在判断,此方法跟第三种第一种有一点儿相似之处。

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
        if (null != view) {  
            ViewGroup parent = (ViewGroup) view.getParent();  
            if (null != parent) {  
                parent.removeView(view);  
            }  
        } else {  
            view = inflater.inflate(R.layout.fragment_main, container, false);  
            initView(view);// 控件初始化  
        }  
        return view;  
  
    } 

总结:

个人感觉最简单的解决方法是3,4 ,具体选用哪个方法需根据实际情况来定。

注意:只适用于返回键重新回退的判断处理,切记,多次重复打开的界面貌似无效文章来源地址https://www.toymoban.com/news/detail-458975.html

到了这里,关于Android之Fragment 跳转返回重复加载重复执行onCreateView的四种解决方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • .net Assembly.Load重复加载程序集造成执行异常

    最近ET做热更重载dll的时候,返回登陆会重新检测新的dll,首次登录之前已经Assembly.Load()过一次dll,第二次返回登陆再次load dll到内存中,Invoke执行方法的时候,异常了,有些方法执行了,有些未执行,于是查资料,看到些老资料说Assembly.Load重复加载同名dll不会有问题,而却现

    2024年02月07日
    浏览(62)
  • 微信小程序:navigateTo页面跳转与navigateBack返回上一页,并执行相关操作

     A页面:执行方法fn,跳转到B页面         跳转方法采用 wx.navigateTo ,跳转到新的页面,保留当前页面 B页面(路径为pages/test/test的页面): ①在某一方法中执行返回操作 wx.navigateBack({     delta: 1 }) ②刷新上一个页面 prevPage.onLoad(); ③调用上一个页面的设置值得方法  p

    2024年02月12日
    浏览(56)
  • Android studio安卓跳转界面(导航栏返回箭头)(十分简单)

    安卓界面跳转(只是实现效果,不讨论其他影响,望周知)   Android studio页面跳转导航栏返回箭头,是非常基础的操作,不讲解,不深究,只是实现效果 导航栏返回箭头,效果如下:   在AndroidManifest.xml下的application中添加     代码如下: 全局代码: 顺便再讲一个显示跳转

    2024年02月06日
    浏览(48)
  • 带你深入了解Fragment懒加载

    Fragment懒加载是一种优化技术,用于在Android应用中延迟加载和初始化Fragment的内容,以提高应用性能和用户体验。它的核心思想是只有在Fragment可见时才加载数据和执行相关操作,而不是在Fragment创建或添加到Activity时立即加载。 懒加载的主要目的是避免在Fragment不可见或不需

    2024年02月06日
    浏览(43)
  • 【Jetpack】Navigation 导航组件 ④ ( Fragment 跳转中使用 safe args 安全传递参数 )

    代码地址 : CSDN ( 本博客代码快照 | 推荐下载 0 积分 ) : https://download.csdn.net/download/han1202012/88251933 GitHub ( 可能已经覆盖 ) : https://github.com/han1202012/Navigation 1、Navigation 组件中的 Bundle 数据传递 之前的 默认 Navigation 跳转方法 , 只需要传入 navigation 资源 ID , 即可完成页面跳转 ; Nav

    2024年02月11日
    浏览(42)
  • 从一个Activity跳转到另一个Activity的指定Fragment,附底部菜单栏的实现

    这部分参考B站视频Springboot: 2022最新版】Android Studio 安装 Android(安卓)开发零基础入门到精通全套教程P118-119 效果图: 忘了需不需要添加依赖了,大概率是本来就有不用添加,但还是把可能有关的依赖先贴上来 先在res下的menu包里(没有就建一个menu包)新建一个 buttom_nav_m

    2024年02月03日
    浏览(37)
  • Android Fragment动画实现

    在 Android 中,你可以使用 FragmentTransaction 来实现 Fragment 的动画效果。这允许你在添加、替换或移除 Fragment 时应用动画,从而改善用户体验。下面是如何实现 Fragment 动画的基本步骤: 1. 创建两个 Fragment: 首先,创建两个 Fragment,例如 FragmentA 和 FragmentB。这些 Fragment 将被用于

    2024年02月09日
    浏览(46)
  • Android 中 Fragment判空

    1. 判断 Fragment 是否已经被添加到 Activity 中,可以通过 Fragment 的 isAdded() 方法来判断。 2. 判断 Fragment 的 View 是否已经被创建,可以通过 Fragment 的 getView() 方法来判断。 3. 判断 Fragment 是否已经被销毁,可以通过 Fragment 的 isDetached() 或 isRemoving() 方法来判断。 示例: if (fragmen

    2024年02月11日
    浏览(55)
  • Xamarin.Android中的Fragment

    一般而言,会在 activity 中添加一个加载 fragment 的方法。通过点击菜单的按钮,加载不同的 fragment 。其样子一般是这样的: 在 fragment 中往往通过工厂模式,提供及返回实例 非常简单,因为fragment一定是要寄存到某个activity中。因此直接使用如下代码: 通过 FragmentManager 查找

    2024年02月10日
    浏览(59)
  • android - fragment 数据丢失?状态丢失?

    最佳答案 一些状态丢失的例子: 1.  假设您有一个按钮和一个 TextView 。在代码中,你已经定义了初始值为 0 的整数 i,它通过单击按钮递增 1,并且它的值显示在 TextView 中。假设你已经按下按钮 5 次,那么 textview 将被设置为 0。也就是说  Integer 在屏幕变化时丢失了它的值 。

    2024年02月10日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包