2017-08-03 107 views
1

我在ListView中的行中獲得了EditTexts。當我點擊其中一個EditText時,出現軟鍵盤,焦點跳轉到列表中的第一個EditText,而不是留在我點擊的字段中。ListView中的多個EditText,點擊以專注於一個EditText並且焦點跳轉到第一個

這裏是它的視頻:我創建了一個完全剝離下來的應用程序來演示該問題

https://youtu.be/ZwuFrX-WWBo

。完整的代碼是在這裏: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所有的文本字段,以便他們可以重新獲得關注,如果它們被不當地取走。

這有助於重新獲得焦點,但後來我發現,當文本區域重新聚焦時,光標會在文本的開始處結束,而不是結束,這對我的用戶來說是不自然和煩人的。

這裏是一個視頻:

https://youtu.be/A35wLqbuIac

下面是該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(),但由於文本字段尚未聚焦,所以選擇被忽略。

+0

你得到了一個很好的解決?我現在有同樣的問題。 –

回答

0

嘗試此一次,它的工作對我來說:

public void setCursorPosition() { 
       focusTarget.requestFocus(); 
       focusTarget.setCursorVisible(true); 
       other.setCursorVisible(false); 
      } else { 
       other.setCursorVisible(true); 
       focusTarget.setCursorVisible(false); 
      } 
     } 
相關問題