2017-08-03 109 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); 
      } 
     } 
相关问题