大家都知道在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点 ...
随机推荐
- [转]Extundelete--数据恢复软件
前言 作为一名运维人员,保证数据的安全是根本职责,所以在维护系统的时候,要慎之又慎,但是有时难免会出现数据被误删除的情况,在这个时候该如何快速.有效地恢复数据显得至关重要,extundelete就是其 ...
- UICollectionView 简单使用
显示数据列表 大家通常使用的是UITableView 不用说TableView 是大家的首选.在iOS6之前这也是必选.但是伴随着APP的成长一起都在变化目前更多的呈现一种块状的显示效果.之前的行式显 ...
- Unity3D 的摄像机
什么是摄像机 Unity3D中,摄像机是一个非常非常重要的组件. 他的作用就是:将你设计的场景投影到设备的屏幕上. 摄像机的属性 1 clear flags 确定屏幕的哪一部分将被清除. 每个摄像机在 ...
- Java Web中将oracle的数据库内容以表格形式展现到页面中(分页展示)
分页SQL语句: ----分页显示 select * from (select rownum as r,t.* from () ; 查询的结果如下: 这个SQL,使用了三层嵌套的查询方式: 1)最内层 ...
- JavaEE EL的一些用法
EL 可以在指示元素中设置EL是否使用 isELIgnored="true" true是不使用 也可以在web.xml中使用 <jsp-config> <jsp- ...
- iOS开发中的错误整理,通过storyboard做项目,遇到view看不见,或者view被压缩的情况
前言:在网易新闻的练习中遇到了这个错误 注意:练习中遇到了如图的bug,主要是因为用storyboard布局 600 * 600 显示的时候要经过自动布局,缩小到相应手机的屏幕大小.也就是有的尺寸 ...
- StyleCop的常见错误
所有规则的翻译(基于版本4.7.44.0): 文档规则 1.SA1600:ElementsMustBeDocumented元素必须添加注释 2.SA1601: PartialElementsMustB ...
- 【POJ 2886】Who Gets the Most Candies?
题意 约瑟夫问题的升级版,每次出去的是前一个出去的人位置+手上的数字(正往前,负往后).第i个出去的人拿的糖是i的约数的个数.求拿糖最多的人和他的糖果数. 分析 线段树单点更新,反素数. 我竟然WA在 ...
- ssh整合常见的错误
1.报错信息:java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refres ...
- mysql中的having
from子句后面可以用where选择行,group by子句后面可以用having子句选择行, having中条件的定义和where中很相似,但是having中可以直接用聚合函数,但是where中不能 ...