Fragment中控件保存值的问题

Fragment详解之六——如何监听fragment中的回退事件与怎样保存fragment状态 前言:计划总是赶不上变化,无论结局怎样,只要一直跟随自己的内心,不放弃,总有一天,你会成为那个人,加油。 相关文章: 1、《Fragment详解之一——概述》 2、《Fragment详解之二——基本使用方法》 3、《Fragment详解之三——管理Fragment(1)》 4、《Fragment详解之四——管理Fragment(2)》 5、《Fragment详解之五——Fragme... 阅读详情

原文地址:http://lihb.github.io/%E5%85%B3%E4%BA%8Efragment%E7%9A%84%E4%B8%80%E4%B8%AA%E9%97%AE%E9%A2%98/

关于fragment的一个问题

今天解决了一个自认为比较棘手的bug。特别记录在此。

背景: 该界面是一个fragment,fragment中有一个EditText控件。出现的问题是,我第一次进入该fragment,

在edittext控件输入内容,然后返回到该fragemnt之前的界面,

接着再次返回到该fragmen界面时,之前在edittext中输入的内容又重新出现在该edittext中。很是奇葩!!!

解决方法:经过数小时的打log,debug之后,本人发现在fragment的生命周期中,如果你只是退出该fragment,

而没有销毁之。fragment会在其生命周期的onViewStateRestored()中,

会重新给edittext控件 setText(),并赋上原来的内容。也就是说,fragment自己保存了控件的一些状态和属性信息。

如果你不想保留原来的值,最好覆写onViewStateRestored()方法,

并在其调用super.onViewStateRestored()之前,抢先调用edittext的setText()方法,亦即覆盖掉fragment中保存的edittext的内容。如下所示:

 
  1. @Override
  2. public void onViewStateRestored(Bundle savedInstanceState) {
  3. mEditText.setText("");
  4. super.onViewStateRestored(savedInstanceState);
  5. }

这样就能解决edittext内容还魂的bug。

但是:当我们在fragment中为这个edittext控件增加一个TextWatcher接口,如下所示:

 
  1. mEditText.addTextChangedListener(mTextWatcher);
  2. private TextWatcher mTextWatcher = new TextWatcher() {
  3. @Override
  4. public void beforeTextChanged(CharSequence s, int start, int count, int after) {
  5. }
  6. @Override
  7. public void onTextChanged(CharSequence s, int start, int before, int count) {
  8. }
  9. @Override
  10. public void afterTextChanged(Editable editable) {
  11. if(editable.length() > 0)
  12. Log.i("log test.......", "我被执行了");
  13. }
  14. };

新的问题又来了。再次进入该fragment时,虽然edittext控件中,没有上次进入填写的内容,

但是afterTextChanged()方法中的log语句被打印出来了。也就是说,虽然edittext中的内容清空了。

但是,mTextWatcher中缓存了一份edittext内容,在重新进入fragment,fragment恢复界面的时候,

当执行到mEditText.addTextChangedListener(mTextWatcher)语句时,mTextWatcher缓存的上次的内容又出来

了,导致log语句被打印出来了。。。。。

解决办法:经过调试,观察fragment的生命周期的先后执行顺序。本人发现打印log语句的时候时间是在生命周期的onResume()方法之前。

于是,就想能不能在通过一个变量控制,并把该变量添加到if语句的判断条件中去,

当代码运行到onResume()之前,该变量值为false;在运行到onResume()方法之后,该变量指变为true。从而控制log语句的打印。

于是试了下,该方法的确可行。进而,本人又从源码中发现,fragment中有个booelan isResumed()方法,

根据此方法的返回值,即可判断是当前代码是运行到onResume()方法之前还是之后。于是最终修改后的代码如下:

 
  1. @Override
  2. public void onViewStateRestored(Bundle savedInstanceState) {
  3. mEditText.setText("");
  4. super.onViewStateRestored(savedInstanceState);
  5. }
  6. ......
  7. mEditText.addTextChangedListener(mTextWatcher);
  8. private TextWatcher mTextWatcher = new TextWatcher() {
  9. @Override
  10. public void beforeTextChanged(CharSequence s, int start, int count, int after) {
  11. }
  12. @Override
  13. public void onTextChanged(CharSequence s, int start, int before, int count) {
  14. }
  15. @Override
  16. public void afterTextChanged(Editable editable) {
  17. if(editable.length() > 0 && isResumed())
  18. Log.i("log test.......", "我被执行了");
  19. }
  20. };

总结:解决问题的方法,不断的调试,在你任何怀疑的地方,输出log,观察现象。最终发现问题的关键所在,从而解决问题。

当然,可能还有其他更好的方法,大家如有遇到,烦请告知,谢谢。

体验独特的ThumbnailMenu Fragment 控件 本文还有配套的精品资源,点击获取 简介:ThumbnailMenu是一个创新的Android UI组件,它通过提供缩略图样式菜单来改善Fragment切换的用户体验。该控件允许开发者在不同Fragment之间切换时,在界面上显示一个缩略图预览。它通过动态切换、动画效果和自定义配置,提升应用的交互性和视觉吸引力。开发者可以通过集成和配置该控件,实现更加直观和流畅的屏幕切换效果... 阅读详情

相关推荐

Fragment保存用户操作

fragmen保存用户操作,在exittext上输入数据后,Fragment相互切换后数据保存

Fragment关闭再打开 控件保存值的问题 尤其是EditText 保存原来值的解决办法

今天解决了一个自认为比较棘手的bug。特别记录在此。 背景: 该界面是一个fragment,fragment中有一个EditText控件。出现的问题是,我第一次进入该fragment, 在edittext控件输入内容,然后返回到该fragemnt之前的界面, 接着再次返回到该fragmen界面时,之前在edittext中输入的内容又重新出现在该edittext中。很是奇葩!!! 解决方法:...

Jason_HD的博客 1262

Android-StatedFragment-保存Fragment的状态

StatedFragment - 保存Fragment的状态

fragment中editText在来回切换中具有记忆性

由于项目需要,Activity加载多个fragment,一次只加载一个,即需要的add,不需要的remove。 遇到的问题,fragment在来回加载中发现已经加在过的fragment中的EditText具有记忆性展示原来的数据,导致特定的fragment中的EditText刷新不了数据。 随后查了下: onViewStateRestored 告知fragment 其视图层次的所

1035

Zephyr RTOS -- 学习笔记总述

文章目录摘要1. 开发基础部分2. 内核服务入门 本笔记基于 Zephyr 版本 2.6.0-rc2 摘要 1. 开发基础部分 2. 内核服务入门 2.1 线程简介 2.2 线程 2.3 工作队列线程 2.4 调度 2.5 中断 2.6 轮询 API 2.7 信号量

思想给了我们太多的自由,而我们拖累了思想...... 4824

Ubuntu离线情况下安装gcc编译器

Ubuntu离线情况下安装gcc编译器1.系统版本2.安装说明3.异常处理 1.系统版本 (1)Ubuntu系统版本:20.04.1LTS; (2)gcc编译器版本:gcc-9.3.0(下载链接为https://download.youkuaiyun.com/download/qq_18350351/13762214); 当前可找到的gcc最新版本为gcc-10,但是笔者在安装gcc-10版本时发现一些依赖项无法安装,因此选取了gcc-9版本。如果是在联网情况下安装,直接使用apt相关的安装指令即可。 2.安装说明 安

GreenHand的博客 3932

Android笔记:解决fragment+viewpager第二次进入的时候没有数据的问题

但是这种方式对于我们说的情况不适用。最关键的是,二者对应的情况不同。我们不能够因噎废食。这样,当 notifyDataSetChanged() 被调用后,会最终触发 instantiateItem(),而不管 getItem() 是否被调用,我们都在重载的 instantiateItem() 函数中已经将所需要的数据传递给了相应的 Fragment。如果你使用的是Fragment的回退栈,确保在适配器的getItem()方法中,对于已经存在的Fragment没有重新创建新的实例,而是使用了回退栈中的实例。

知道的越多,不知道的越多。 1379

AP发票批量付款程序(WEB ADI)

CREATE OR REPLACE PACKAGE MEW_AP_BATCH_PAYMENTS_PKG IS   PROCEDURE MAIN(P_BATCH_ID          NUMBER                 ,P_ORG_ID            NUMBER                 ,P_BANK_ACCOUNT_NAME VARCHAR2

储藏室 5051

使ViewPager中的Fragment的状态不销毁

//有如下5个类似的Fragment:  TabBFm,TabAFm,TabBFm,TabBFm,TabBFm,

u011057161的专栏 3702

用YOLO11-seg玩转裂缝分割:CBAM注意力魔改+轻量化GhostConv实战

本文详细解析了如何利用YOLO11-seg进行裂缝分割任务,结合CBAM注意力机制和GhostConv轻量化改造,显著提升模型性能。通过实战案例展示从数据准备、模型训练到部署优化的全流程,特别针对小目标检测和复杂背景干扰等挑战提供解决方案,最终实现高效准确的裂缝检测系统。

j0k1l2m3n的博客 287

std::map看来可以被淘汰了?可以用vector来替代,而且更好

vector的优势在于内存连续,可以先std::sort,然后std::lower_bound,或者std::binary_search。而std::map,insert的时候,需要new出内存。

tumu_C的博客 1019

清空fragment中的内容_Android开发中,使用 EditText 输入内容,如何进行一键清空内容处理...

本文仅为个人的处理方式,希望能对您有所帮助,欢迎各位留言指正1、text.xml示例:<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent...

weixin_36221082的博客 345

App渗透 - 人脸识别登录绕过

一、APP抓包和逆向破解加密算法打开APP是一个登录框抓包后发现参数被加密了使用Jadx脱源码发现,并没有加壳也没有混淆,运气很好根据经验,先搜索Encrypt、Decrypt等关键字,发现在Common.js中有一个encryptData函数定位过去,一套加解密算法都写好了放在这放到浏览器console里面调试,果然没错二、寻找注入点首先测试了一下注入明文:{"userName":"TEST'...

渗透测试研究中心 2823

00_小知识点

1. 底部控件不受输入法影响被顶到上方 解:在AndroidManifest.xml中给这个Activity设置 <activity android:windowSoftInputMode="stateVisible|adjustPan" >2. 动态设置控件margin值 解: LayoutParams是RelativeLayout或者Linea...

weixin_30408309的博客 105

【LLM数据篇】预训练数据集+指令生成sft数据集

在《Aligning Large Language Models with Human: A Survey》综述中对LLM数据分类为典型的人工标注数据、self-instruct数据集等 优秀的开源sft数据集:alpaca_data、belle、千言数据集、firefly、moss-003-sft-data多轮对话数据集等 文章目录 note 构造指令实例的3种方式 sft:Aligning Large Language Models with Human: A Survey Alpaca 1. self

发现问题,并解决问题,批判性思维 1万+

使用RV1126实现人脸识别——将Facenet模型转换为RKNN模型

在本文中,我们将探讨如何在RV1126芯片上实现人脸识别,并将Facenet模型转换为RKNN(Rockchip Neural Network)模型,以在RV1126上进行高效的人脸识别。Fine-tuning是指在预训练模型的基础上,使用自己的数据集进行进一步训练,以适应特定的任务。同时,我们需要下载Facenet模型的预训练权重,这些权重将作为我们的基础模型。综上所述,我们详细介绍了如何在RV1126上实现人脸识别,并将Facenet模型转换为RKNN模型。方法将模型导出为RKNN格式的文件。

code_program481的博客 1522

Android Fragment状态保存

Fragment的状态保存 在fragment状态保存之前先来了解以下Activity的状态保存: Activity有两个方法应用恢复和保存状态,他们分别是: override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState,) } override fun onRestoreInstanceState(savedInstanceState: Bundle)

m0_55721894的博客 3512

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Fragment的状态保存和恢复

Fragment的状态保存与恢复 了解Fragment的状态保存与恢复首先会想到二个问题: 1.Fragment什么时候进行状态保存,什么时候进行状态恢复 2.保存恢复什么状态,Fragment状态还是View状态。 什么时候状态保存?什么时候状态恢复? 当Fragment有很大可能被销毁的时候,系统会调用Fragment的 onSaveInstanceState 方法 例如: 用户按HOM...

木头小颖的博客 3576

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Activity和Fragment状态保存和恢复

概述 日前在Fragment状态保存时翻了一个错误,造成了一些crash错误,因此查询资料对于activity和fragment的状态保存做了一个简单的总结。 一、Activity状态保存 说道activity的状态保存,就不得不提到activity的生命周期。 activity的生命周期是一个老生常谈的问题了,activity的生命周期主要包括如下几个方法: onCreate onStart onRestart onResume onPause onStop onDestory 主要流程如图所示。

cat_is_so_cute的博客 1555

如何监听fragment中的回退事件与怎样保存fragment状态

一、如何监听Fragment中的回退事件 1、问题阐述 在Activity中监听回退事件是件非常容易的事,因为直接重写onBackPressed()函数就好了,但当大家想要监听Fragment中的回退事件时,想当然的也想着重写onBackPressed()方法,这时候你会发现:Fragment中根本就没有onBackPressed()方法给你重写。这可怎么破! 想想,在前面的例子

zhangtongyuan0909的博客 707

弹出框DialogFragment传值给Fragment,并且Fragment对应控件更新内容

在DialogFragment中添加回调接口,Fragment中触发该接口,当DialogFragment触发onDismiss方法关闭的时候,调用该接口,这样Fragment就能监听到DialogFragment是否关闭,并做出相应改变。接口具体内容: http://blog.youkuaiyun.com/qq_33339175/article/details/52647957 当Fragment监听到D

qq_33339175的博客 3985

viewPager结合Fragment使用怎么保存Fragment的状态

viewPager和Fragment一起使用的时候需要注意Fragment的状态保存和Fragment的数据预加载问题。 上一篇文章我眼中的Fragment基类的写法通过创建Fragment基类解决了Fragment和ViewPager一起使用时的数据预加载问题。 但是仔细看我的上一篇文章中关于具体的Fragment写法中,我通过重写了setLazy()方法来加载数据,还有关键的方...

活在当下!输出快乐! 3023

Fragment状态保存(四)

Fragment中的状态保存和Activity中的状态保存一致。 Activity中非正常的窗口销毁,比如窗口到后台,由于内存不足,销毁,或者横竖屏切换,一般需要保存状态。当窗口发生配置变化时,会调以下两个方法。 @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInsta

大煤球 608

Fragment-如何监听fragment中的回退事件与怎样保存fragment状态

一、如何监听Fragment中的回退事件 1、问题阐述 在Activity中监听回退事件是件非常容易的事,因为直接重写onBackPressed()函数就好了,但当大家想要监听Fragment中的回退事件时,想当然的也想着重写onBackPressed()方法,这时候你会发现:Fragment中根本就没有onBackPressed()方法给你重写。这可怎么破!想想,在前面的例子中,我们在Act...

weixin_30699831的博客 137
上一篇: fragment is not a fragment
下一篇: 与jClarityCEO合影
Manaasdfasdf
博客等级 码龄11年 131粉丝 151原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值