我在ListView中的行中获得了EditTexts。当我点击其中一个EditText时,出现软键盘,焦点跳转到列表中的第一个EditText,而不是留在我点击的字段中。ListView中的多个EditText,点击以专注于一个EditText并且焦点跳转到第一个
这里是它的视频:我创建了一个完全剥离下来的应用程序来演示该问题
。完整的代码是在这里:https://pastebin.com/YT8rxqKa
我没有做任何事情来改变我的代码的焦点:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = layoutInflater.inflate(R.layout.cell_textfield, parent, false);
}
TextView label = (TextView) convertView.findViewById(R.id.textview1);
EditText textfield = (EditText) convertView.findViewById(R.id.textview2);
String text = String.format("Row %d", position);
label.setText(text);
textfield.setText(text);
return convertView;
}
我发现another post on StackOverflow给人一种解决方法这个愚蠢的Android行为,这涉及对把一个OnFocusChangedListener所有的文本字段,以便他们可以重新获得关注,如果它们被不当地取走。
这有助于重新获得焦点,但后来我发现,当文本区域重新聚焦时,光标会在文本的开始处结束,而不是结束,这对我的用户来说是不自然和烦人的。
这里是一个视频:
下面是该OnFocusChangeListener的代码。它可以解决移动焦点的愚蠢的Android行为,但是在重新获得焦点之后,光标就错位了。
View.OnFocusChangeListener onFocusChangeListener = new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View view, boolean hasFocus) {
long t = System.currentTimeMillis();
long delta = t - focusTime;
if (hasFocus) { // gained focus
if (delta > minDeltaForReFocus) {
focusTime = t;
focusTarget = view;
}
}
else { // lost focus
if (delta <= minDeltaForReFocus && view == focusTarget) {
focusTarget.post(new Runnable() { // reset focus to target
public void run() {
Log.d("BA", "requesting focus");
focusTarget.requestFocus();
}
});
}
}
}
};
我讨厌不得不把绷带上的绷带上的绷带,试图让Android的只是表现为它自然会预期行为,但我会采取什么我可以得到的。
1)有什么我可以做的,以解决源的问题,而不是必须有OnFocusChangeListener?如果(1)不可能,那么我怎样才能确保当我强制回到正确的字段时,我确保光标放在最后?我尝试在requestFocus()后面使用setSelection()
,但由于文本字段尚未聚焦,所以选择被忽略。
你得到了一个很好的解决?我现在有同样的问题。 –