zoukankan      html  css  js  c++  java
  • (转载)解决ListView中使用EditText所遇到的一些冲突

       大家都知道在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">
    10     </EditText>
    11  
    12 </LinearLayout>
    很简单list_item包含一个TextView,还有一个就是EditText。

    运行后在某一项EditText进行输入,点击返回键隐藏输入法键盘时会遇到一个问题即所有项的EditText内容都被清空了。

    解决办法:在Manifest中Activity标签下加入android:windowSoftInputMode="adjustPan"。

    这个问题是解决了,但是还有其他的问题。

    当你点击最后一项时,没有问题,此时最后一项的EditText拥有焦点。然后,点击系统返回键,再点击最后一项,此时你会发现输入法将最后一项完全挡住了(这样很影响用户体验)。

    解决方法:当点击系统返回键时,让其释放焦点。

    有人肯定会先这样处理:

    1 @Override
    2     public boolean onKeyDown(int keyCode, KeyEvent event) {
    3         // TODO Auto-generated method stub
    4         if (keyCode == KeyEvent.KEYCODE_BACK) {
    5              //释放焦点
    6         }
    7         return super.onKeyDown(keyCode, event);
    8     }

    但是很遗憾,当输入法键盘显示的时候,你点击系统的返回键事件被捕获了,而不会在onKeyDown里执行。

    01 @Override
    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) {
    07             //释放焦点
    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();
    13             }
    14         }
    15     }
    16     return super.dispatchKeyEventPreIme(event);
    17 }

    自定义控件重写dispatchKeyEventPreIme方法判断软键处于活动状态,并且用户按下了返回键盘。

    说到这里提一下,自定义adapter的getView方法中view不要复用

    1 @Override
    2     public View getView(int position, View convertView, ViewGroup parent) {
    3         convertView = mLayoutInflater.inflate(R.layout.list_item, null);
    4         return convertView;
    5     }
    写到这里觉得这种实现方式和ScrollView+LinearLayout本质差不多

     顺便提一下怎么保存数据:

    01 editText1.addTextChangedListener(new TextWatcher() {
    02  
    03             @Override
    04             public void onTextChanged(CharSequence s, int start, int before,
    05                     int count) {
    06             }
    07  
    08             @Override
    09             public void beforeTextChanged(CharSequence s, int start, int count,
    10                     int after) {
    11             }
    12  
    13             @Override
    14             public void afterTextChanged(Editable s) {
    15                 //保存数据
    16             }
    17         });
    最后,附demo下载 http://www.oschina.net/code/snippet_132911_14137
    路漫漫其修远兮 吾将上下而求索
  • 相关阅读:
    mojo 接口示例
    MojoliciousLite: 实时的web框架 概述
    接口返回json
    centos 6.7 perl 版本 This is perl 5, version 22 安装DBI DBD
    centos 6.7 perl 5.22 安装DBD 需要使用老的perl版本
    商业智能改变汽车行业
    商业智能改变汽车行业
    读MBA经历回顾(上)目的决定手段——北漂18年(48)
    perl 升级到5.20版本
    Group Commit of Binary Log
  • 原文地址:https://www.cnblogs.com/hudabing/p/3769764.html
Copyright © 2011-2022 走看看