android settext方法,Android中EditText setText方法的踩坑实战
1、平平常常中就这样开始
某一天,我准备做一个搜索功能,这个搜索功能呢大概是在主活动A中,用EditText接收输入,当EditText监听到输入框中内容有变化,跳转到活动B中,活动B中准备有搜索历史记录等等,等在活动B中确定好搜索关键词后,跳回到活动A中,执行搜索,并显示搜索结果……一切顺顺利利,然后呢,懵逼了,我回不了活动A了。
当时的情况大致是这样的,
布局文件:activity_main.xml
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".ActivityA">
android:inputType="text"
android:singleLine="true"
android:imeOptions="actionSearch"
android:id="@+id/et_search"
android:textSize="24sp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="输入点啥呗"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
android:textSize="24sp"
android:gravity="center"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="我是主活动啦"/>
活动A:AcitivityA.java
public class ActivityA extends AppCompatActivity {
private EditText searchEditText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//找到EditText,添加文本监听
searchEditText=findViewById(R.id.et_search);
searchEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
Log.d("editTextSetText","beforeTextChanged");
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
Log.d("editTextSetText","onTextChanged");
}
@Override
public void afterTextChanged(Editable s) {
Log.d("editTextSetText","afterTextChanged");
startActivity(new Intent(ActivityA.this,ActivityB.class));
}
});
//接收B活动传递过来的keywords,并显示在输入框中
String keyword=getIntent().getStringExtra("keywords");
if(keyword!=null)
searchEditText.setText(keyword);
}
活动B布局文件:activity_search.xml
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
android:id="@+id/et_search_keywords"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="输入你想要找的东西"
android:textSize="24sp"
android:inputType="text"
android:singleLine="true"
android:imeOptions="actionSearch"/>
android:textSize="24sp"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="我就是那个准备搜索关键词,历史记录等等等等的活动B啦" />
活动B:ActivityB.java
public class ActivityB extends AppCompatActivity {
private EditText editTextKeyWords;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
editTextKeyWords = findViewById(R.id.et_search_keywords);
editTextKeyWords.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
//将取得关键字传递到A中
String keywords = v.getText().toString().trim();
Intent intent = new Intent(ActivityB.this, ActivityA.class);
intent.putExtra("keywords", keywords);
Log.d("editTextSetText", "B keywords:" + keywords);
startActivity(intent);
ActivityB.this.finish();
}
return false;
}
});
}
}
OK,至此大功告成,我成功复原了当时我大致做法,也还原了当时的Bug:在A中有输入时,跳到B,在B中确定好关键词后,点击搜索(你的搜索在哪里,让你们看下图吧)
看到右下角我圈起来的那个搜索按钮了吗,布局文件照着我那个写,监听就是editTextKeyWords.setOnEditorActionListener(……),布局中重要的是
android:inputType="text"
android:singleLine="true"
android:imeOptions="actionSearch"
这个主要是参看这位大大的,当然了,在此这不算重点,重点是我又成功写了个Bug。当时项目挺急的,我弄了半天没弄明白,(我一直以为是A活动因为setText而崩溃了,然而没有log……当然,最终证明似乎不是这样子。),无奈之下,福灵心至,想到:
2、用了setHint()解决了当务之急
无奈之下选择了该方法,问题成功解决,也没什么明显瑕疵,就是心理一直惦记着,这他丫的问题出在什么地方呢,定位当然是定位到了A活动中的searchEditText.setText(keyword)这一句。
后来加了几天班,等稍微有空了,我再回头瞧瞧,莫非,谷歌给我们写了个小bug,结果嘛:事实证明,好像这东西是自己的锅。
3、发现敌踪迹
当时我实在onResume()调用searchEditText.setText(keyword)这几句的,所以问题显得比我上面写的要隐蔽些。当然,有空了之后,我进入setText方法,一步步执行,当然了,没发现明显问题。只是我偶尔会发现它会不经意间往beforeTextChanged等这一两个方法中眺一下,那么想一想我在里面又做了什么……,似乎我发现问题所在了。那么有了猜测,对该方法添加log,我们队log做下修改,使其能明确地显示程序执行顺序,修改代码如下:
ActivityA.java
public class ActivityA extends AppCompatActivity {
private EditText searchEditText;
public static int executeOrder=0;//表示log执行顺序,进而推测代码执行顺序
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("editTextSetText","after setContentView "+executeOrder++);
//找到EditText,添加文本监听
searchEditText=findViewById(R.id.et_search);
searchEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
Log.d("editTextSetText","beforeTextChanged "+executeOrder++);
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
Log.d("editTextSetText","onTextChanged "+executeOrder++);
}
@Override
public void afterTextChanged(Editable s) {
Log.d("editTextSetText","afterTextChanged "+executeOrder++);
startActivity(new Intent(ActivityA.this,ActivityB.class));
}
});
//接收B活动传递过来的keywords,并显示在输入框中
String keyword=getIntent().getStringExtra("keywords");
if(keyword!=null) {
searchEditText.setText(keyword);
Log.d("editTextSetText","after set text "+executeOrder++);
/*searchEditText.setHint(keyword);*/
}
}
}
ActivityB.java
public class ActivityB extends AppCompatActivity {
private EditText editTextKeyWords;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
Log.d("editTextSetText", "B after setContentView " +ActivityA.executeOrder++);
editTextKeyWords = findViewById(R.id.et_search_keywords);
editTextKeyWords.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEARCH) {
//将取得关键字传递到A中
String keywords = v.getText().toString().trim();
Intent intent = new Intent(ActivityB.this, ActivityA.class);
intent.putExtra("keywords", keywords);
Log.d("editTextSetText", "B keywords:" + keywords+" " +ActivityA.executeOrder++);
startActivity(intent);
ActivityB.this.finish();
}
return false;
}
});
}
}
执行一遍,log如下:
上述log显示,做如下解读:
1、 启动应用,执行初始化,打印 0
2、输入内容,执行1,2,3,到启动活动B
3、活动B初始化执行 4
5、 活动B中点击搜索 5,并启动活动A
6、A再一次初始化 执行6
7、问题出来了,为什么会执行7、8、9,此时我们并没有EditText输入内容,但是监听触发了。
8、 执行9之后,启动活动B,执行11没问题,但是10的顺序按理说应该在6之后、紧接着6.
尽管未能完全解读这个执行顺序,但是,写的程序陷入了一个类似死循环的bug是没有问题的,这也就解开了为什么返回不了A活动的问题,并不是不能返回A,而是返回A之后又跳转到B了。
进一步调试,在关键节点增加log,我们再setText前后增加log
if(keyword!=null) {
Log.d("editTextSetText","after set text "+executeOrder++);
searchEditText.setText(keyword);
Log.d("editTextSetText","after set text "+executeOrder++);
/*searchEditText.setHint(keyword);*/
}
log信息:
关键点我已经标出来了,在7和11间,有了监听方法的执行,说明:EditText的setText方法会触发 文本变化的监听,这就是此次踩坑的根源。
4、 捕获凶手:setText()方法会触发EditText文本变化的监听
5、解决方案:将setText设置在设置监听之前,或者用setHint也可以。
如上,找出问题症结之后,解决办法就很简单了,我们将setText写在设置监听之前就可以避免该坑,或者干脆用setHint方法。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
android settext方法,Android中EditText setText方法的踩坑实战相关推荐
- python new方法_Python中的__new__()方法的使用
__new__() 函数只能用于从object继承的新式类. 先看下object类中对__new__()方法的定义: class object: @staticmethod # known case ...
- Android 获取短信验证码并自动填充(踩坑小米、荣耀、OPPO、华为)
Android 获取短信验证码并自动填充(踩坑小米.荣耀.OPPO) 前言 最近弄了个短信自动填充功能,一开始觉得很简单,不就是动态注册个广播接收器去监听短信消息不就可以了吗?结果没这么简单,问题就出 ...
- python find的使用方法_Python中的rfind()方法使用详解
Python中的rfind()方法使用详解 rfind()方法返回所在子str 被找到的最后一个索引,或者-1,如果没有这样的索引不存在,可选择限制搜索字符串string[beg:end]. 语法 以 ...
- python3.7 的pygame安装方法_Python中pygame安装方法图文详解
本文实例讲述了Python中pygame安装方法.分享给大家供大家参考,具体如下: 这里主要描述一下我们怎样来安装pygame 可能很多人像我一样,发现了pygame是个好东东,但是就是不知道怎样使用 ...
- python使用方法-python中dict使用方法详解
dict的特性 dict是python中的一个可变的数据类型,用{}表示,dict的key必须是不可变的数据类型,而value的数据类型可以任意. 格式:{key:value,key:value,ke ...
- 【Groovy】闭包 Closure ( 闭包调用 与 call 方法关联 | 接口中定义 call() 方法 | 类中定义 call() 方法 | 代码示例 )
文章目录 总结 一.接口中定义 call() 方法 二.类中定义 call() 方法 三.完整代码示例 总结 在 实例对象后使用 " () " 括号符号 , 表示调用该实例对象的 ...
- vue暴露的全局方法_Vue中实现全局方法
内心背景:今天偶然上到论坛,看到关于Vue的两篇阅读量破千,我TM膨胀了啊.赶快再写一篇我开始用Vue时遇到的问题. 现实背景:很多时候我们会在全局调用一些方法. 实现方式两种:官网的实现use方法, ...
- python中的str方法和repr方法_Python中 的 __str__ 方法和 __repr__ 方法的区别有哪些
Python中 的 __str__ 方法和 __repr__ 方法的区别有哪些 发布时间:2020-11-05 17:11:48 来源:亿速云 阅读:95 作者:Leah 本篇文章给大家分享的是有关P ...
- python魔术方法print_Python中的魔术方法入门
介绍 在Python中,所有以"__"双下划线包起来的方法,都统称为"Magic Method",中文称『魔术方法』,例如类的初始化方法 __init__ ,P ...
最新文章
- 阿里云智能运维的自动化三剑客
- Docke的WEB管理工具
- 进程线程003 模拟线程切换
- AndroidManifest.xml清单文件要点
- Word插入公式中如何编辑 argmin
- 基于SOCKS的IPv4向IPv6过渡技术
- htop的VIRT是什么
- 使用BabeLua在VS中创建Lua项目。
- Power BI 数据分析基础
- 英语口语收集(十九)
- Go语言【ftm库】
- 快速将彩色照片变成黑白照片(仅适用于jpg格式)
- Notepad ++中的一个著名插件FingerText
- 求:生意参谋 data 破解,最好是用php
- 安装包UI美化之路-nsNiuniuSkin安装包模板介绍-新模板上线啦
- 转战物联网·基础篇01-物联网之我见
- 基于labview的波峰与波谷检测
- 夺命雷公狗C/C++-----6---命令行编程
- [ZJOI2022]面条
- ubuntu18.04虚拟机使用过程中存储空间爆满问题(.cache)
热门文章
- 工业用微型计算机自考复习,自考工业用微型计算机复习.doc
- java有声小说如何开发_怎么才能做有声小说播音,有声书主播如何训练
- 让『产业数据+AI分析』助力产业园区数字化转型,推动园区智慧发展
- 211209-word利用VBA宏命令投稿将修改处标蓝色
- ADC单端转差分电路分析
- 20 Newsgroups数据集介绍
- 很受启发的视频啊~~视频: 史蒂夫 乔布斯 2005年 斯坦福大学 演讲(中英字幕)
- oracle查询字体,客户端为Oracle 11g 查询中文字体 显示乱码
- 安兔兔评测HTML5,安兔兔评测
- RabbitMQ安装配置