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

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

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

我的问题是这些:

1)如何选择我的EditText字段,然后滑入软键盘不会使我的EditText失去焦点?

...失败了......

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

我的清单确实包含了android:windowSoftInputMode="stateAlwaysVisible" ,但直到我点击EditText时,键盘才出现。 忽略'stateAlwaysVisible'属性似乎只发生在模拟器中 - 在我配置的设备上,它很荣幸能够让上述问题2在设备上工作......但不在模拟器中。

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


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

  • 如果重点放在另一种观点上,那么这种观点就失去了重点
  • 目标获得焦点
  • 软键弹出。
  • 这会导致目标失去焦点
  • 代码检测到这种情况并调用target.requestFocus()
  • 由于Android的废话,最左边的最顶层的视角受到关注
  • 由于requestFocus被调用,最左边的视图失去焦点
  • 目标终于获得关注

    //////////////////////////////////////////////////////////////////
    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();
                        }
                    });
                }
            }
        }
    };
    
  • 上面的代码适用于键盘弹出窗口。 但是,它不检测语音到文本弹出窗口。


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

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

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

    问候


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

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

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

    我通过在EditText上使用OnFocusChangeListener记录焦点丢失时的时间戳,然后在重新创建列表项时使用getView()解决此问题,如果当前时间在焦点丢失后的某个阈值内,请调用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();
        }
    }
    
    链接地址: http://www.djcxy.com/p/24217.html

    上一篇: When the soft keyboard appears, it makes my EditText field lose focus

    下一篇: First letter capitalization for EditText