Android 带有 EditText 的 ListView 在键盘显示时失去焦点。键盘随机出现

Android ListView with EditText loses focus when the keyboard displays. Keyboards appear randomly

我是一名 iOS 开发人员,我接到了修复此问题的任务。 挖掘和谷歌搜索后,我不知道该怎么做。

我们有这个屏幕:

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

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

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

尝试各种方法后: getExtractedText on inactive InputConnection warning on android onClick event is not triggering | Android Android EditText doesn't show the Keyboard ...

我不知道是什么问题。

根据一篇 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 个项目时,键盘不会覆盖内容并且不会发生乒乓效应。

也许这对您有用: How can I detect a click in an onTouch listener?
尝试删除 onClick 并仅使用 onTouch,希望对您有所帮助。

我不确定您是否有此视图的 xml,或者如果您有 xml,您是否正在以编程方式生成这些编辑文本,然后对每个编辑文本执行 android:inputType="number" 如果您以编程方式生成这些编辑文本,则对每个 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) {

            }
        });

更新

Android 带有 EditText 的 ListView 在键盘显示时失去焦点第二次它工作正常。发生这种情况的原因是所有视图都被再次渲染,所以项目行中曾经聚焦的 EditText 字段对象现在是一个完全不同的对象。 android:descendantFocusability="beforeDescendants" 在你的 ListView 和 android:windowSoftInputMode="adjustPan"在应用清单

中为您的activity
<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