首页 > 解决方案 > 当键盘显示时,带有 EditText 的 Android ListView 失去焦点。键盘随机出现

问题描述

我是一名 iOS 开发人员,我被赋予了解决此问题的任务。在挖掘和谷歌搜索之后,我不知道该怎么做。

我们有这个屏幕:

在此处输入图像描述

此屏幕是带有自定义 Fragment 的 Activity,包含由 ArrayAdapter 提供的 ListView。适配器似乎通过 getView 生成视图。每行有七个 EditText 控件。

问题 1:第一次显示屏幕时,您点击任何 EditText,没有任何反应。为什么?当您第二次和任何后续时间点击时,焦点有效,键盘出现,您可以输入。

问题2:这很难描述。在某些设备上,点击任何 EditText 会导致键盘在某些数字和字母数字类型之间切换,这种情况会一直持续然后停止。为什么?

在尝试了各种东西之后: android onClick 事件上的非活动 InputConnection 上的 getExtractedText 警告未触发 | Android Android EditText 不显示键盘 ...

我不知道是什么问题。

根据其中一篇 SO 帖子,您不应该同时拥有 onClick 和 onTouch,但它们就在这里。为什么?

        editText.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    view.requestFocus();
                    break;
            }
            return false;
        }
    });

    editText.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ((EditText) v).selectAll();
        }
    });
    editText.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_ENTER) {
                if (event.getAction() == KeyEvent.ACTION_UP) {
                    InputMethodManager imm = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                }
            }
            return false;
        }
    });
    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                double amount = Double.parseDouble(((EditText)v).getText().toString());
                DecimalFormat df = new DecimalFormat("0.0");
                String result = df.format(amount);
                ((EditText)v).setText(result);
            }
        }
    });
}

我仍在挖掘,注释掉各种代码,但我一无所知,请帮忙。

完整代码:https ://gist.github.com/MartinBergerDX/473c47b008b6b0570466794f221eca31

更新1:

我删除了所有的监听器、onTouch、onFocus 和文本观察器。

这仍在发生:

在此处输入图像描述

更新 2:

这似乎与覆盖 ListView 的键盘有关。不知道为什么,但是当我在数据源中设置少于 10 个项目时,键盘不覆盖内容并且不会发生乒乓效果。

标签: androidandroid-studioandroid-edittext

解决方案


我不确定您是否有此视图的 xml,或者如果您有 xml,您是否正在以编程方式生成这些 edittext,然后对于每个编辑文本执行android:inputType="number"如果您以编程方式生成这些 editext 然后为每个edittext.setInputType执行此操作(InputType.TYPE_NUMBER_FLAG_SIGNED | InputType.TYPE_CLASS_NUMBER); 使用这个唯一的数字键将显示用户输入接下来只需将 addTextChangedListener 添加到每个editText

editText.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
//handle your changes here
    }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

更新

带有 EditText 的 Android ListView 在键盘显示时失去焦点问题是,当您有一个具有输入功能字段的 ListView 显示软键盘焦点时,EditText 第一次失去焦点,但第二次它工作正常。发生这种情况的原因是所有视图都再次呈现,因此项目行中的 EditText 字段对象曾经被聚焦,现在是一个完全不同的对象。ListView 中的android:descendantFocusability= " beforeDescendants" 和应用清单中的android:windowSoftInputMode="adjustPan"活动

<ListView android:id="@+id/productList" android:layout_width="match_parent"
 android:layout_height="wrap_content" android:layout_alignLeft="@+id/search" 
android:layout_below="@+id/search" 
android:padding="5dp" 
android:descendantFocusability="beforeDescendants"/>
<activity android:name=".myActivity" 
android:label="@string/app_name" android:screenOrientation="sensorPortrait" android:windowSoftInputMode="adjustPan"/> 

参考https://www.mysamplecode.com/2013/02/android-edittext-listview-loses-focus.html


推荐阅读