博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android N(7.0) 在ListView里显示EditText时软键盘弹出时会自动切换到全键盘的问题?...
阅读量:6608 次
发布时间:2019-06-24

本文共 2451 字,大约阅读时间需要 8 分钟。

Android N(7.0) 在ListView里显示EditText时软键盘弹出时会自动切换到全键盘的问题?

问题症状描述

  1. Activity 在AndroidManifest.xml里设置android:windowSoftInputMode="adjustPan"
  2. 在ListView里绘制Item
  3. Item控件为EditText
  4. EditText设置InputType为Number
  5. 当在Android 7.0系统上,点击EditText时,弹出的软键盘为“数字”输入模式,但是瞬间就会切换到“全键盘”模式。

    在7.0之前的系统,都没有出现这种问题。

尝试性解决方案(风险未评估)

/** * 尝试性修复了在ListView里显示EditText InputType为 其它非text 类型时,弹出的软键盘会从数字键盘自动切换为 英文全键盘 的问题。 */class ListViewEx2 extends ListView{public ListViewEx2(final Context context){    super(context);}public ListViewEx2(final Context context, final AttributeSet attrs){    super(context, attrs);}public ListViewEx2(final Context context, final AttributeSet attrs, final int defStyleAttr){    super(context, attrs, defStyleAttr);}@TargetApi(Build.VERSION_CODES.LOLLIPOP)public ListViewEx2(final Context context, final AttributeSet attrs, final int defStyleAttr, final int defStyleRes){    super(context, attrs, defStyleAttr, defStyleRes);}@Overrideprotected void onLayout(final boolean changed, final int l, final int t, final int r, final int b){    //XXX:经过初步测试,只有在Android 7.0平台以上的系统才会出现软键盘自动切换的问题。    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N && changed)        super.onLayout(changed, l, t, r, b);    else        super.onLayout(changed, l, t, r, b);}}

ListView.java 源码对比

Android 7.0 部分可疑的改动过的源码

private class FocusSelector implements Runnable {    // the selector is waiting to set selection on the list view    private static final int STATE_SET_SELECTION = 1;    // the selector set the selection on the list view, waiting for a layoutChildren pass    private static final int STATE_WAIT_FOR_LAYOUT = 2;    // the selector's selection has been honored and it is waiting to request focus on the    // target child.    private static final int STATE_REQUEST_FOCUS = 3;    public void run() {        if (mAction == STATE_SET_SELECTION) {            setSelectionFromTop(mPosition, mPositionTop);            mAction = STATE_WAIT_FOR_LAYOUT;        } else if (mAction == STATE_REQUEST_FOCUS) {            final int childIndex = mPosition - mFirstPosition;            final View child = getChildAt(childIndex);            if (child != null) {                child.requestFocus();            }            mAction = -1;        }    }    }}

Android 6.0 部分可疑的改动过的对应旧版本源码

private class FocusSelector implements Runnable {           public void run() {        setSelectionFromTop(mPosition, mPositionTop);    }    }

参考资料

转载于:https://www.cnblogs.com/AsionTang/p/7730290.html

你可能感兴趣的文章
网络流,流水线模拟
查看>>
Asp.net 微信支付
查看>>
mxd文件批量更换版本
查看>>
重新关联bat文件的打开方式为系统默认方式
查看>>
SQL视图&触发器
查看>>
知识点笔记
查看>>
陈云川的OPENLDAP系列
查看>>
【Python第十篇】HTML/CSS
查看>>
django 模型-----自连接
查看>>
C# 实现屏幕键盘 (ScreenKeyboard)
查看>>
P1197 [JSOI2008]星球大战
查看>>
如何用js得到当前页面的url信息方法(JS获取当前网址信息)
查看>>
EBS 中常用的配置文件及说明
查看>>
Cover Points
查看>>
OpenCV for Python 学习笔记 二
查看>>
[转]Centos6.5安装配置keepalived
查看>>
能不能,不再只是竞赛?
查看>>
Base64编码的字符串与图片的转换 C#
查看>>
浅谈JS-cookie,你是香甜可口的小点心吗?
查看>>
SpringBoot注解
查看>>