android - 当键盘显示时,带有 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 个项目时,键盘不覆盖内容并且不会发生乒乓效果。
解决方案
我不确定您是否有此视图的 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
推荐阅读
- c# - 受保护属性的 WebAPI 反序列化为空
- docker - 安装文本编辑器以在 ASP.NET Core 3.1 Docker 容器中编辑 appsettings.json
- javascript - 用所选数据替换表格数据(javascript)
- amazon-redshift - Redshift 视图定义权限问题
- python - 是否可以将所有 Kivy 代码放在从 Main 调用的 python 用户函数中?
- cloudera-cdh - 从 kudu 磁盘迁移数据
- javascript - 如何使用顶级等待将 TypeScript 编译为 JavaScript?
- python - Python循环破坏了整个脚本
- micronaut - Micronaut HTTP 过滤器修改响应负载
- delphi - 仅从父信息构建 TreeView