大家都知道在listView中使用editText,在输入过程中是有冲突的。今天稍微研究了一下这个问题,有一点点小小的心得和大家一起分享下。
首先建立一个最简单的demo,主界面就是一个ListView,其中list_item的布局代码如下:
01 |
<?xml version="1.0" encoding="utf-8"?> |
02 |
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" |
03 |
android:orientation="vertical" android:layout_width="match_parent" |
04 |
android:layout_height="match_parent"> |
05 |
<TextView android:layout_width="wrap_content" |
06 |
android:layout_height="wrap_content" android:text="TextView" |
07 |
android:id="@+id/textView1" android:textSize="20sp"></TextView> |
08 |
<EditText android:layout_width="match_parent" |
09 |
android:layout_height="wrap_content" android:id="@+id/editText1"> |
很简单list_item包含一个TextView,还有一个就是EditText。
运行后在某一项EditText进行输入,点击返回键隐藏输入法键盘时会遇到一个问题即所有项的EditText内容都被清空了。
解决办法:在Manifest中Activity标签下加入android:windowSoftInputMode="adjustPan"。
这个问题是解决了,但是还有其他的问题。
当你点击最后一项时,没有问题,此时最后一项的EditText拥有焦点。然后,点击系统返回键,再点击最后一项,此时你会发现输入法将最后一项完全挡住了(这样很影响用户体验)。
解决方法:当点击系统返回键时,让其释放焦点。
有人肯定会先这样处理:
2 |
public boolean onKeyDown(int keyCode, KeyEvent event) { |
3 |
// TODO Auto-generated method stub |
4 |
if (keyCode == KeyEvent.KEYCODE_BACK) { |
7 |
return super.onKeyDown(keyCode, event); |
但是很遗憾,当输入法键盘显示的时候,你点击系统的返回键事件被捕获了,而不会在onKeyDown里执行。
02 |
public boolean dispatchKeyEventPreIme(KeyEvent event) { |
03 |
if (context != null) { |
04 |
InputMethodManager imm = (InputMethodManager) context |
05 |
.getSystemService(Context.INPUT_METHOD_SERVICE); |
06 |
if (imm.isActive() && event.getKeyCode() == KeyEvent.KEYCODE_BACK) { |
08 |
for (int i = 0; i < getChildCount(); i++) { |
09 |
View view = getChildAt(i); |
10 |
EditText editText1 = (EditText) view |
11 |
.findViewById(R.id.editText1); |
12 |
editText1.clearFocus(); |
16 |
return super.dispatchKeyEventPreIme(event); |
自定义控件重写dispatchKeyEventPreIme方法判断软键处于活动状态,并且用户按下了返回键盘。
说到这里提一下,自定义adapter的getView方法中view不要复用
2 |
public View getView(int position, View convertView, ViewGroup parent) { |
3 |
convertView = mLayoutInflater.inflate(R.layout.list_item, null); |
写到这里觉得这种实现方式和ScrollView+LinearLayout本质差不多
顺便提一下怎么保存数据:
01 |
editText1.addTextChangedListener(new TextWatcher() { |
04 |
public void onTextChanged(CharSequence s, int start, int before, |
09 |
public void beforeTextChanged(CharSequence s, int start, int count, |
14 |
public void afterTextChanged(Editable s) { |
最后,附demo下载 http://www.oschina.net/code/snippet_132911_14137
- ListView 中含有 EditText 导致焦点丢失的问题
ListView 中的 item 中有 EditText 时. 如果activity的输入法选项设置为 android:windowSoftInputMode="adjustResize&q ...
- 关于ListView中包含EditText数据复用引起异常的解决方案
概述 前几天测试提了一个bug,在ListView中添加留言信息,导致错乱的问题.实际上就是ListView需要添加一个EditText,复用导致错乱的问题,这个问题以前也遇到过.诸如,ListVie ...
- ListView中含有EditText时候--要命的焦点问题迎刃而解
最近做项目的时候遇到了一个问题,就是在ListView的item上面含有一个EditText,要求是这样: 1当点击item的时候,item可以点击; 2当点击EditText的时候EditText也 ...
- Android开发 解决AlertDialog中的EditText无法调出输入法的问题
在AlertDialog中使用自定义的View,如果View中有EditText,在上面点击,默认是跳不出软键盘的,不是焦点的问题.解决方法,有两种,一是把AlertDialog换成Dialog,但这 ...
- 完美解决ListView中事件ItemCreated中使用ClientID导致插入数据失败
于昨天晚上看到视频做到这个例子,但是发现始终有错误,在ListView的ItemCreated事件中使用了ClientID则会导致数据插入数据库失败.当点击插入按钮时,网页就像点击F5刷新一样,无任何 ...
- Android 解决ListView中每一项与button冲突
在listView的item里面如果有button,ImageButton等控件,会使得ListView不会被点击,解决方法是: ①在Button上面添加属性 android:focusable=&q ...
- 转载---解决 eclipse 中发布的java-web工程,jar包无法发布到tomcat 的lib下。
1.首先: Server Locations修改后会变灰,如果需要更改设置,则需要移除与Tomcat服务器关联的项目,同时,鼠标右键菜单Clean清除Tomcat服务器的状态^^就可以修改了. 此时E ...
- 在ListView中添加EditText丢失光标问题解决
<ListView android:id="@android:id/list" android:layout_height="fill_parent& ...
- 解决ListView中Item的子控件与Item点击事件冲突
常常会碰到在ListView中点击当中一个Item.会一并触发其子控件的点击事件.比如Item中的Button.ImageButton等.导致了点击Item中Button以外区域也会触发Button点 ...
随机推荐
- php模式设计之 单例模式
模式设计是什么?初学者一开始会被这高大上的名称给唬住.而对于有丰富编程经验的老鸟来说,模式设计又是无处不在.很多接触的框架就是基于各种模式设计形成的. 简单说,在写代码的过程中一开始往往接触的是面向过 ...
- 我从腾讯那“偷了”3000万QQ用户数据,出了份很有趣的独家报告!
声明: 1.目前程序已停止运行!QQ空间也已升级访问安全机制. 2.本“分析”数据源自部分用户的公开信息,并未触及隐私内容,广大网友无需担心. 3.QQ空间会不定期发布大数据分析报告,感兴趣的朋友关注 ...
- 第五章 与众不同的this
我们来看下面的代码: ①var name="windows"; function myfun() //定义一个函数myfun { console.log("I'm &qu ...
- 开源分布式计算引擎 & 开源搜索引擎 Iveely 0.5.0 为大数据而生
Iveely Computing 产生背景 08年的时候,我开始接触搜索引擎,当时遇到的第一个难题就是大数据实时并发处理,当时实验室的机器我们可以随便用,至少二三十台机器,可以,却没有程序可以将这些机 ...
- Java并发编程-ReentrantLock
代码示例: Lock lock = new ReentrantLock(); lock.lock(); try { // update object state } finally { lock.un ...
- [C#]二维码(QR Code)生成与解析
写在前面 经常在大街上听到扫码送什么什么,如果真闲着没事,从头扫到位,估计书包都装满了各种东西.各种扫各种送,太泛滥了.项目中从没接触过二维码的东东,最近要使用,就扒了扒网络,发现关于解析二维码的类库 ...
- C基础之递归(思想很重要,学会找规律)
递归思想的条件:1.函数自己调用自己 2.函数必须有一个固定的返回值(如果没有这个条件会发生死循环) ----规律很重要 简单递归题目一: 设计一个函数计算一个整数的n次方,比如2的3次方,就是8 步 ...
- 读JS高级API笔记_(DOM&&DOM2&&DOM3)哎呀——园龄才9个月啊
---恢复内容开始--- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http: ...
- Java设计模式-代理模式(Proxy)
其实每个模式名称就表明了该模式的作用,代理模式就是多一个代理类出来,替原对象进行一些操作,比如我们在租房子的时候回去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你 ...
- Spring-事物的隔离级别
Spring中定义了5中不同的事务隔离级别: 1. ISOLATION_DEFAULT(一般情况下使用这种配置既可) ; 这是一个PlatfromTransactionManager默认的隔离级别,使 ...