关于ListView、EditText、光标、和软键盘

需求:显示若干行信息,每行都包含 EditText,每个 EditText 都可以输入。

当时的解决办法:ListView + LinearLayout
布局大致情况:ListView 嵌套 LinearLayout, 30个item,每个 Item 包含一个 EditText,也还有其他控件(button, checkbox 等)

遇到的问题:

  1.  当时清单文件使用的默认配置 (即 android: windowSoftInputMode 没有做任何配置)
           点击任意一个 Item 中的 Edittext 之后,软件盘正常弹出,但是很快发现点中的Edittext 并没有获取焦点(即没有光标在闪烁)。根据查阅资料的说法是弹出输入法之后 ListView 进行了重绘导致失去了焦点。

           此时我没有沿着这条线路继续,而是想到了之前的解决办法,看2。

  2.  根据查阅的资料,在清单文件中该Activity做如下配置

<span style="font-size:12px;">      android:windowSoftInputMode = adjustPan
</span>

经过测试发现,焦点和光标问题确实解决了,点击 EditText 弹出软件盘后并不会失去焦点,但是如果想连续输入(输入法不收回,直接下滑),发现最下端的几个Item不能完全显示(滑不上去)。(其实收回软键盘再下滑完全没有问题,但是测试人员就说这是 bug ,没办法还是继续解决呗!)


我试着在 LIstView 下方添加了一个占位 View ,想让 ListView 重绘时留够空间,结果发现无论添加多高的占位 View ,都没有作用。作罢,还是回到方法1。


继续方法1:

    首先:

      android:windowSoftInputMode = adjustResize 

    然后在 ListView 适配器的 getView() 方法中,EditText 添加事件

    int index = -1;
        edittext.setOnTouchListener(new OnTouchListener() {
            public boolean onTouch(View view, MotionEvent event) {
    //在TOUCH的UP事件中,要保存当前的行下标,因为弹出软键盘后,整个画面会被重画
    //在getView方法的最后,要根据index和当前的行下标手动为EditText设置焦点
                if (event.getAction() == MotionEvent.ACTION_UP) {
                    index = position;
                }
                return false;
            }
        });
     
  if (index != -1 && index == position) {
            // 如果当前的行下标和点击事件中保存的index一致,手动为EditText设置焦点。 <pre name="code" class="java">            edittext.requestFocus(); 
            //强制将光标移动到最后
<pre name="code" class="java"><pre name="code" class="java">            edittext.setSelection(radio.note.getText().length());
        }
 
 
 


以上,即可解决问题。(并非完全原创,结合以下两篇文章,总结了解决问题的过程,防止自己再犯同样的错误)

参考:http://blog.youkuaiyun.com/L_serein/article/details/7517011

参考:http://www.cnblogs.com/haofei/p/3305030.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值