android 积累一点关于fragment的知识

Android中ViewPager获取当前显示的Fragment 前言 在项目中,有时会用到在ViewPager中显示同样类型的Fragment,同时这样的Fragment的个数是动态的,但是PagerAdapter没有给我们提供getCurrentFragment类似的方法。下面就给大家介绍下Android中ViewPager获取当前显示的Fragment的方法,一起看看吧。 一、使用 getSupportFragmentManager().findFragmentByTag()方法 Viewpager + FragmentPagerAdapter 情况下 才好使; FragmentPagerAdapter 有一个特点 凡是加载过的Fragment 都会 立即下载

ERROR:Unable to instantiate fragment

 

之前看到别人的一个项目,要求如下:找出android机里所有的应用程序,展现在viewpager里的fragment上,当然fragment里展现的是一个应用程序列表,点击每一个item进入对应应用,退出应用返回目录。其中退出的时候出现这个问题。

 

原因:见到fragment里有空构造函数,突发奇想,重写构造函数,直接在构造函数里传值,貌似运行没有问题,但若fragment没有杀死,由不可见到可见的时候,就会出此bug

 

 

解决办法:1 向fragment里传值:

                课本:setArgument(bundle对象)

                        bundle里如果传入对象还要序列化

 

                2 fragment里创建静态的方法,返回对应fragment对象。(数据源同样需要序列化)

                    

    public static AppFragment newInstance(List<AppInfo> appInfos) {
        Bundle bundle = new Bundle();
        bundle.putParcelableArrayList("appInfos", (ArrayList<? extends Parcelable>) appInfos);
        AppFragment fragmanet_app = new AppFragment();
        fragmanet_app.setArguments(bundle);
        return fragmanet_app;
    }

                 fragment里要取出传入的值:

        Bundle bundle = this.getArguments();
        if (bundle != null) {
            appInfos = bundle.getParcelableArrayList("appInfos");
        }

                向fragment里传值

        new AppFragment().newInstance(SettingApps)

 

ERROR:commit already called

解决办法:1.全局的  

FragmentManager fragmentManager;

2.每次切换都刷新一遍:

fragmentTransaction = fragmentManager.beginTransaction().setCustomAnimations(
        android.R.anim.fade_in, android.R.anim.fade_out);

切换fragment不刷新数据

 public void changeFragment(Fragment to) {
        if (currentFragment != to) {
            fragmentTransaction = fragmentManager.beginTransaction().setCustomAnimations(
                    android.R.anim.fade_in, android.R.anim.fade_out);
            // 先判断是否被add过
            if (!to.isAdded()) {
                // 隐藏当前的fragment
                fragmentTransaction.hide(currentFragment).add(R.id.content, to).commit();
            } else {
                fragmentTransaction.hide(currentFragment).show(to).commit(); //提交
            }
            currentFragment = to;
        }
    }

切换fragment,较为完善的方案

private Fragment currentFragment;

    public void changeFragment(Fragment to,String fragmentTag) {
 
        fragmentManager = getSupportFragmentManager();
        fragmentTransaction = fragmentManager.beginTransaction();
        if (to != null && !to.isAdded()&&fragmentManager.findFragmentByTag(fragmentTag)==null) { // 先判断是否被add过
            if (currentFragment != null&&currentFragment!=to) {
                fragmentTransaction.hide(currentFragment).add(R.id.rl_content_frg, to).commitAllowingStateLoss();
            } else {
                if (currentFragment==null){
                    fragmentTransaction.add(R.id.rl_content_frg, to,fragmentTag).commitAllowingStateLoss();
                }
            }
            currentFragment = to;
        } else {
            if (currentFragment != null && currentFragment != to) {
                fragmentTransaction.hide(currentFragment).show(to).commitAllowingStateLoss(); // 隐藏当前的fragment,显示下一个
                currentFragment = to;
            }
        }
    
    }

fragment不能显示的问题

最近在7.0系统中使用上面的方法,发现fragment不能显示的问题。故思考的几个办法

1.可能add,hide,show等方法在7.0不兼容,因为6.0,4.4可以显示,so使用viewpager代替。这个方法不可取,临发布前更换架构,码农大忌。

2.可能fragment里有耗时操作导致fragment不加载。有这个可能性,但不适用于当前情况。上面代码的逻辑是,显示fragment时,如果fragment已经展示过,就不会初始化了,而是用show将页面展示出来。但bug的情况是,有概率导致切换fragment的时候,3个页面都不展示。而且activty的某个动画也卡死。如果是展示fragment时卡死,至少有个fragment的背景吧。so,这个可能性较低

3.最大的可能性,就是在activty显示fragment的之前,对frament做了一些操作。我的activty在oncreate的时候就已经new了fragment了,展示的时候就show或者add,但我review代码发现,在new之后,展示之前,我调用了eventbus给fragment发消息,刷新数据了。问题就在这里了,我没有展示fragment,但我发消息给fragment让他刷新ui导致,展示的时候概率性加载不出,去掉后测试果不其然。

 

下面提供一个不用fragmentManager.findFragmentByTag,切换fragment的方法:

 public void changeFragment(Fragment to, String fragmentTag) {
        if (currentFragment == null) {
            //第一次
            fragmentManager = getSupportFragmentManager();
            fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.add(R.id.rl_content_frg, to);
            fragmentTransaction.show(to);
            fragmentTransaction.commit();
            currentFragment = to;
        } else {
            fragmentManager = getSupportFragmentManager();
            fragmentTransaction = fragmentManager.beginTransaction();
            if (to.isAdded()) {
                fragmentTransaction.hide(currentFragment);
                fragmentTransaction.show(to);
                fragmentTransaction.commit();
                currentFragment = to;
            } else {
                fragmentManager = getSupportFragmentManager();
                fragmentTransaction = fragmentManager.beginTransaction();
                fragmentTransaction.add(R.id.rl_content_frg, to);
                fragmentTransaction.hide(currentFragment);
                fragmentTransaction.show(to);
                fragmentTransaction.commit();
                currentFragment = to;
            }
        }
      
    }

 

 

 

 

 

 

Amesim基础篇-元件详解-流体库管路 阅读详情

相关推荐

避坑指南:ZYNQ平台上AXI 1G/2.5G Ethernet Subsystem实现IEEE1588的5个关键点

本文详细解析了在ZYNQ平台上使用AXI 1G/2.5G以太网子系统实现IEEE1588精密时间协议(PTP)的5个关键避坑点。从硬件选型、Vivado工程配置到Linux驱动适配,提供了实战经验与优化技巧,帮助工程师在工业自动化、电力系统等场景中实现纳秒级时间同步。

weixin_30687051的博客 232

Android "Unable to instantiate fragment"解决方案

但凡项目中有用到Fragment的,基本上都会遇到RT问题。笔者在网上查了很多相关资料,都没有发现对出现这个问题的原因进行深入分析的。所以打算在本文结合源码来分析下这个问题的产生,并提供解决方案。下面进入正题 一旦手机系统配置被修改,如字体、语言等等;我们的Activity就会销毁并重新创建,因此再次进入应用时,报错如下: Caused by: android.support.v4.a

鑫哥的博客 1万+

《探秘 BME680温度湿度气压气体传感器模块:环境感知的卓越之选》:此文为AI自动生成

BME680 是一款由博世公司推出的集成环境传感器模块,在环境监测和物联网等领域中发挥着重要作用。它能够同时测量温度、湿度、气压和气体浓度等多个环境参数,为各种应用提供准确可靠的环境数据。该模块采用小巧的封装形式,便于集成到各种设备中,无论是智能家居、可穿戴设备还是工业监测系统,都能轻松适配。例如,在智能家居系统中,BME680 模块可以监测室内环境参数,如温度、湿度、气压和空气质量等。通过与智能家居控制器或智能手机应用程序的连接,用户可以实时了解室内环境状况,并根据需要进行调整。

zheng_ruiguo的专栏 1865

【Android】Unable to instantiate fragment 解决方案

今天在 Bugly 上发现一个崩溃信息:Java.lang.NoSuchmethodException: could not find Fragment constructor。 这问题有点意思,居然找不到 Fragment 的构造方法?Ctrl + Shift + F 全局搜索 Unable to instantiate fragment,发现抛出异常的地方反射无参构造方法,获取 Fragment 实例。 再回头看 Bugly 上堆栈信息,发现了蛛丝马迹,在 Fragment 恢复保存状态的时候崩溃了

chenxuxu的专栏 7838

银河麒麟高级服务器操作系统V10SP2(X86)PXE无人值守批量部署实战指南

本文详细介绍了银河麒麟高级服务器操作系统V10SP2(X86)PXE无人值守批量部署的实战指南。通过PXE网络引导技术,实现全自动化、高效率的系统部署,特别适用于企业级数据中心和国产化替代项目。文章涵盖基础环境准备、关键服务配置、Kickstart高级定制及部署测试等核心内容,帮助用户快速掌握批量部署技巧。

weixin_42525637的博客 382

ESP32实战:破解校园网WPA2-Enterprise认证的完整指南

本文详细介绍了如何使用ESP32开发板破解校园网WPA2-Enterprise认证的完整指南。通过硬件准备、环境搭建、核心代码实现及常见问题排查,帮助开发者解决企业级WiFi连接难题,特别适用于校园网环境下的物联网设备开发。

weixin_29194817的博客 454

Android bugs——Caused by: android.support.v4.app.Fragment$InstantiationException

Error: Caused by: android.support.v4.app.Fragment$InstantiationException: Unable to instantiate fragment xxx: make sure class name exists, is public, and has an empty constructor that is public 原因: 当切换到其他应用时,会调用FragmentActivity的onSaveInstanceState方法,再次进入,A

小欣儿的专栏 1693

[ESP32S3N16R8][LVGL8.3.0][IDF5.2.3]ST7701S RGB屏幕驱动[vscode最详细配置]

ST7701S ESP32S3 基于ESP-IDF5.2.3编写,编程环境为vscode。本教程详细讲述了esp32s3配置st7701s屏幕驱动以及gt911触摸驱动并关联到lvgl8.3.0,使用IDF5.23示例rgb_panel进行测试删除了其里面的屏幕驱动,改为单独编写屏幕和触摸驱动,最后完成了实列。

qq_44022379的博客 2604

【Android】Fragment报错

Unable to instantiate fragment XXXXFragmentt: could not find Fragment constructor 解决:之前为了传入参数,写了带参数的构造函数,才导致这个报错。通过setXXX()方法调用传入参数,删除带参数的构造函数 https://www.jianshu.com/p/e8c831e9ae73 ...

qq_43467051的博客 3926

数字人接大模型第二步:语音克隆

推荐XTTS-v2项目,由Coqui公司开发的语音生成模型,专为多语言语音克隆和生成设计。它支持17种语言,包括英语、西班牙语、法语、德语、意大利语、葡萄牙语、波兰语、土耳其语、俄罗斯语、荷兰语、捷克语、阿拉伯语、中文、日语、匈牙利语、韩语和印地语。XTTS-v2的核心优势在于其仅需6秒的音频片段即可实现语音克隆,无需大量的训练数据。此外,它还支持情感和风格转移、跨语言语音克隆以及多语言语音生成,采样率高达24kHz。地址:https://github.com/archwesome/XTTS-v2。

403

2023华为od机试【最小循环子数组】C++

2023华为od机试【最小循环子数组】C++ 给定一个由若干整数组成的数组nums,请检查数组是否是由某个子数组重复循环拼接而成,请输出这个最小的子数组。

MISAYAONE的博客 2185

Fragment恢复时注意事项:InstantiationException,别在Fragment写有参数的构造方法

最近使用Fragment时遇到的一个问题,记录下来。该问题出现的概率很小,也就是非必现。但是因为很多人也会这样使用Fragment,所以很可能你的项目中也隐藏着这样的一个bug,只是发生概率太小无法发现。问题主要跟Activity的数据恢复有关,其可能产生的Exception: android.support.v4.app.Fragment$InstantiationException: Unab

scnuxisan225的专栏 8885

15、分布式参数热交换器:建模、动态特性与控制

本文综述了分布式参数热交换器的建模、动态特性和控制方法。从热交换器的基本方程推导出发,探讨了一维流动、流动强迫、错流、螺旋和旋转再生式热交换器的建模方法,并分析了其动态行为和频率响应中的共振现象。同时,介绍了热交换器的模拟方法,包括数值模拟和近似方法,并讨论了多种控制策略,如常规控制、最优控制、数字控制以及自适应控制。最后,总结了热交换器研究的发展历程,并展望了未来的研究方向,包括建模精度提升、控制算法优化和跨学科融合等。

w8x9y0z1的博客 123

Android studio安卓实践,一些知识点积累

List item Android EditText保留两位小数 double d = 3.1465926; String result = String.format("%.2f", d); System.out.println(result);

H.千面的博客 548

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Android 开发中积累的知识点

Android 开发中积累的知识点 Android使用命令行查看命令行编译问题 查看详细错误描述 gradlew compileDebugJavaWithJavac gradlew compileDebug --stacktrace -info gradlew compileDebugSources --stacktrace -info 导航栏和状态栏 去除导航栏 在styles中修改...

WJ的博客 305

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Android学习--Fragment

Android架构学习进阶是一条漫长而艰苦的道路,不能靠一时激情,更不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!上面分享的字节跳动公司2021年的面试真题解析大全,笔者还把一线互联网企业主流面试技术要点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。【Android高级架构视频学习资源】Android部分精讲视频领取学习后更加是如虎添翼!进军BATJ大厂等(备战)!

2401_84121871的博客 831

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Android开发Viewpager+Fragment页面滑动切换

本人专注于Android/java/数据库/微信小程序技术领域的开发,以及有好几年的计算机毕业设计方面的实战开发经验和技术积累;尤其是在安卓(Android)的app的开发和微信小程序的开发,很是熟悉和了解;本人也是多年的Android开发人员;希望我发布的此篇文件可以帮助到您;🍅。

u014388322的专栏 1744

## 关于Android中Fragment跳转到Activity闪退的问题

关于Android中Fragment跳转到Activity闪退的问题 问题说明:我想实现从当前MeFragment中点击一下Button按钮,跳转到登录界面,所以我在MeFragment.java里的onCreate()方法中为TextView控件添加监听事件。但在实际运行中,我点击Button之后,会出现闪退现象。 R.layout.fragment_me,为当前fragment所绑定的页面 R...

qq_37182915的博客 4904

android fragment返回按钮,Android 经典笔记之三:Fragment中返回键事件处理

目录介绍1.Fragment中返回键事件处理1.1 如何在Fragment中处理返回键事件1.2 如何区分Fragment和Activity的返回键事件1.3 总结2.Fragment中监听返回键的第二种方法好消息博客笔记大汇总【16年3月到至今】,包括Java基础及深入知识点,Android技术博客,Python学习笔记等等,还包括平时开发中遇到的bug汇总,当然也在工作之余收集了大量的面试题,...

weixin_36418584的博客 2009

Android中Fragment的两种使用方法

Fragment作为Android的一个基本组件,学会使用它还是很方便的,当然第一次接触Fragment,我还是很蒙的,真的是不会使用。但是随着时间的积累,我慢慢的也懂了,想想刚开始的无奈,现在真是有一点小开森啊^_^ 好了,开始讲使用的方法了。 Fragment有两种是使用的方法,根据使用的方法不一样,它分为动态使用和静态使用,下面我分别进行介绍。         要使用Fragment,

ProgramChangesWorld的专栏 1446

Android Activity和Fragment生命周期

写在前边: 感觉要暂时放弃自己钟爱的computer graphics转战安卓开发了,心里还是有一点不开心。。。。但是我不会放弃CG的!! 想要把自己平时积累的知识记录下来,以便将来回来看看,同时也希望能帮到有需要的人。 正文: 在Android中,activity和fragment的生命周期一直很繁琐,有时候也是傻傻分不清楚,先贴两张图,分别对应activity和fragment的生命周

我这知识都学杂了 2931

Android Activity与Fragment之间的传值概述

Activity 与 Fragment 之间进行数据传递是,在Activity中将要传递的数据封装在 Bundle中,然后在 Activity 中使用 Fragment 的实例通过 setArgument(Bundel bundel) 方法绑定传递,在要传递到的Fragment中 使用this.getArgment(),得到传递到的Bundle,从而获取到传递

代码小疯子 2484

安卓应用开发学习:在Fragment结构中使用SharedPreferences保存共享参数

本文介绍了在安卓应用开发中,如何在Fragment结构中使用SharedPreferences实现多页面参数存储功能。作者通过将单页应用升级为三页ViewPager2架构,解决了不同工作场景下需要手动修改参数的问题。借助DeepSeek提供的完整解决方案,创建了SharedPreferences工具类,并分别实现了BMI、汇率和数学计算三个Fragment的参数存储功能。在开发过程中,解决了Toast提示中Context使用不当的问题,最终成功实现了各页面独立保存参数的功能。该方案采用键名前缀区分不同页面数

bahamutj的博客 720

android 开发积累-fragment卡死

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34388207的博客 382

看完全都会了!Android开发热门前沿知识,积累总结

面试官: Handler中有Loop死循环,为什么没有阻塞主线程,原理是什么 心理分析:该问题很难被考到,但是如果一旦问到,100%会回答不上来。开发者很难注意到一个主线程的四循环居然没有阻塞住主线程 **求职者:**应该从 主线程的消息循环机制 与Linux的循环异步等待作用讲起。最后将handle引起的内存泄漏,内存泄漏一定是一个加分项 前言 Android的消息机制主要是指Handler的运行机制,对于大家来说Handler已经是轻车熟路了,可是真的掌握了Handler?本文主要通过几个问题围.

m0_57064830的博客 109

如何让fragment每次都重新加载_如何让他每次约会后,都更爱你一点?

最近听说了这么一件事,堪称神奇。有个朋友去相亲,一开始么都是去比较高端的地方,喝的是红酒,吃的是牛排,倒是能谈下去,但是相亲局结束后,两人都很有默契的没有继续往下联系了,就当是个见过一面,加过微信的陌生人。后来有次相亲,她转换了阵地,到了公司附近的咖啡馆里,点了一杯巧克力饮品,还买了小蛋糕,聊的么都是正常话题,也没有什么让人印象深刻的特点,本来以为这场相亲也会草草结束,然后就没有下文,结果各自回家...

weixin_39738115的博客 144
上一篇: android 积累一些RecycylerView的常见用法
下一篇: android 广播的知识积累
泡温泉的咸鱼
博客等级 码龄11年 39粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值