当出现软键盘时,它使我的EditText字段失去焦点

我在ListView中有几个EditText字段。 当我点击其中一个EditText字段时,键盘滑入视图(应该如此),但我点击的EditText字段失去了焦点。 我已经尝试过使用各种InputMethodManager方法来使键盘在视图中开始(为了解决问题而不是真正解决问题),但是这并不奏效 – 当Activity出现时键盘不在视图中。

EditText的types是number ,当键盘滑入时,它是一个数字键盘,但是当它完成滑动并且EditText失去焦点时,它将更改为字母键盘(这增强了EditText不再具有焦点的想法) 。

我的问题是这些:

1)我如何使我的EditText字段的select和随后滑入软键盘不会使我的EditText失去焦点?

没有那个…

2)我怎样才能让键盘开始在视图中,所以它永远不必滑入(从而避免我觉得这样反感的行为)?

我的清单确实包括android:windowSoftInputMode="stateAlwaysVisible" ,但键盘不会出现,直到我点击一个EditText。 忽略“stateAlwaysVisible”属性似乎只发生在模拟器中 – 在我configuration的设备上,它是荣幸的,所以上面的问题2在设备上工作,但不在模拟器中。

感谢您的任何帮助,您可以提供!

这是我如何做到的。 当触摸EditText键入文本时,会多次调用onFocusChangeListener() 。 顺序是:

  1. 如果焦点是不同的观点,那么这个观点就失去了重点
  2. 目标获得重点
  3. 软键盘popup。
  4. 这导致目标失去焦点
  5. 代码检测到这种情况,并调用target.requestFocus()
  6. 由于Android的废话,最左边的,最顶层的观点获得了关注
  7. 由于requestFocus被调用,最左边的视图失去焦点
  8. 目标终于获得重点

     ////////////////////////////////////////////////////////////////// private final int minDelta = 300; // threshold in ms private long focusTime = 0; // time of last touch private View focusTarget = null; 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 > minDelta) { focusTime = t; focusTarget = view; } } else { // lost focus if (delta <= minDelta && view == focusTarget) { focusTarget.post(new Runnable() { // reset focus to target public void run() { focusTarget.requestFocus(); } }); } } } }; 

上面的代码适用于键盘popup窗口。 但是,它不检测语音到文本popup窗口。

您需要在AndroidManifest.xml中进行更改

在持有列表视图的活动中添加android:windowSoftInputMode =“adjustPan”。 这将解决您的问题。

  <activity android:name=".MyEditTextInListView" android:label="@string/app_name" android:windowSoftInputMode="adjustPan"> 

问候

在我的情况下,这是因为当ListViewresize时,它重新创build所有列表项(即它再次调用每个可见列表项的getView())。

由于EditText在我从getView()返回的布局中,这意味着它是EditText的另一个实例,而不是之前有焦点的实例。 次要的结果是,当软键盘出现或消失时,我发现我正在失去EditText的内容。

因为我希望我的视图保持完全可访问性(即,我希望它被resize,而不是隐藏在键盘窗口后面的某些部分不可访问),所以我不能使用弗兰克的答案,否则这似乎是最好的方法。

我解决了这个问题,在EditText上使用OnFocusChangeListener来logging焦点丢失时的时间戳,然后在getView()重新创build列表项时,如果当前时间在焦点丢失的某个阈值内,调用requestFocus( )将其返回给相关的EditText。

您也可以从此刻的EditText的前一个实例中获取文本,并将其传输到新实例。

 private class MyAdapter<Type> extends ArrayAdapter<String> implements OnFocusChangeListener { private EditText mText; private long mTextLostFocusTimestamp; private LayoutInflater mLayoutInflater; public MyAdapter(Context context, int resource, int textResourceId, ArrayList<String> data, LayoutInflater li) { super(context, resource, textResourceId, data); mLayoutInflater = li; mTextLostFocusTimestamp = -1; } private void reclaimFocus(View v, long timestamp) { if (timestamp == -1) return; if ((System.currentTimeMillis() - timestamp) < 250) v.requestFocus(); } @Override public View getView (int position, View convertView, ViewGroup parent) { View v = mLayoutInflater.inflate(R.layout.mylayout, parent, false); EditText newText = (EditText) v.findViewById(R.id.email); if (mText != null) newText.setText(mText.getText()); mText = newText; mText.setOnFocusChangeListener(this); reclaimFocus(mText, mTextLostFocusTimestamp); return v; } @Override public void onFocusChange(View v, boolean hasFocus) { if ((v == mText) && !hasFocus) mTextLostFocusTimestamp = System.currentTimeMillis(); } } 

您应该在硬件键盘始终可见的设备上testing此代码。 行为也可能发生在这里。

为了避免这种情况,你可以让键盘总是可见的..但是这不是很容易,你可以看到这个线程:

https://groups.google.com/forum/#!topic/android-developers/FyENeEdmYC0

从理论上讲,您可能需要创build自己的Android键盘(虽然使用的是Android键盘的基础),如下所述: Android:如何使键盘始终可见?

这个人有同样的问题,除此之外。 他通过使用ScrollView和LinearLayout而不是ListView来解决这个问题。

在持有listview或EditText的活动中添加android:windowSoftInputMode =“adjustResize”。 这将解决您的问题。

 <activity android:name=".MainActivity" android:windowSoftInputMode="adjustResize"> </activity> 

在AndroidManifest.xml中,在包含视图的活动中使用adjustNothing

 <activity android:name=".ActivityName" android:windowSoftInputMode="adjustNothing">