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
我是一名 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