我在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()
,但由於文本字段尚未聚焦,所以選擇被忽略。
你得到了一個很好的解決?我現在有同樣的問題。 –