Android:当键盘消失时,EditText上的错误弹出窗口不会向下移动

时间:2011-06-16 20:35:00

标签: android popup android-edittext

我有一个活动,在屏幕上显示一些用于用户输入的EditTexts。为了确保软键盘在显示时我没有覆盖我的字段我设置了属性

android:windowSoftInputMode="adjustPan"

表示我在清单中的活动。我在1时验证EditText的内容。视图失去焦点2.当用户执行'Enter'操作时。验证后,如果该值无效,我正在调用

setError(CharSequence error)
EditText上的

,这会导致弹出窗口显示包含我传入的错误。问题是如果在软键盘显示时向上移动EditText,并且此时显示弹出窗口(验证失败),当键盘消失时,弹出窗口不会跟随EditText,它会保持在首次显示的位置。

有关如何解决此问题的任何想法?这是Android中的错误吗?

5 个答案:

答案 0 :(得分:10)

如果这是你所描述的,我认为这可能是一个真正的错误,所以可能值得在Android Source site上写一下。

显然我只能想到黑客的工作!

keyboard disappears

时覆盖
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
 if (keyCode == KeyEvent.KEYCODE_BACK && 
     event.getAction() == KeyEvent.ACTION_UP) {
         revalidateEditText();
         return false;
 }
 return super.dispatchKeyEvent(event);
}

public void revalidateEditText(){
       // Dismiss your origial error dialog           
       setError(null);
       // figure out which EditText it is, you already have this code
       // call your validator like in the Q
       validate(editText); // or whatever your equivalent is
}

这将重新验证您的EditText,关闭您的错误对话框并重新显示它。

那声音怎么样?

灵感来自:Get back key event on EditText

答案 1 :(得分:2)

您还可以创建自定义EditText并覆盖onKeyPreIme方法(int keyCode,KeyEvent事件)

@Override
public boolean onKeyPreIme(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
        clearFocus();
        return false;
    }
}

答案 2 :(得分:1)

对我来说,它有助于将布局包装在ScrollView中。在此之后,setError-box的所有滚动都运行良好。

答案 3 :(得分:0)

您是否尝试过验证视图,即调用视图的invalidate()方法。

尝试editText.invalidate();

感谢。

答案 4 :(得分:0)

我找到了SOLUTION!

以下是代码:

import android.content.Context;
import android.os.Handler;
import android.support.v7.widget.AppCompatEditText;
import android.util.AttributeSet;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.inputmethod.InputMethodManager;

/**
 * Created by Jaume Colom Ferrer on 14/12/2015
 */
public class EditTextPopUpFixed extends AppCompatEditText {

    private static final int TIME_SLEEP = 500;

    private Context ctx;
    private EditTextListener mListener;
    private int backTimes = 0;

    public EditTextPopUpFixed(Context context) {
        super(context);
        ctx = context;
    }

    public EditTextPopUpFixed(Context context, AttributeSet attrs) {
        super(context, attrs);
        ctx = context;
    }

    public EditTextPopUpFixed(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        ctx = context;
    }

    public void setEditTextListener(EditTextListener lis) {
        mListener = lis;

        this.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {

                backTimes = 0;
                return false;
            }
        });
    }

    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {

        if (keyCode == KeyEvent.KEYCODE_BACK)
            backTimes++;

        if (backTimes == 3) {
            backTimes = 0;
            mListener.close();
            return true;
        }

        if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_ENTER) {
            InputMethodManager mgr = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
            if (mgr.isActive()) {
                mgr.hideSoftInputFromWindow(this.getWindowToken(), 0);
                boolean mustRevalidate = getError() != null;
                setError(null);
                if (mListener != null && mustRevalidate) {
                    Handler han = new Handler();
                    han.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            mListener.revalidateEditText();
                        }
                    }, TIME_SLEEP);
                }
            } else {
                backTimes = 0;
                super.onKeyPreIme(keyCode, event);
            }
            return true;
        }
        return false;
    }

    public interface EditTextListener {
        void revalidateEditText(); //Revalidates the EditText to refresh the Popup (Must revalidate the EditText in its implementation)

        void close(); // Method to close the activity or fragment (Must finish activity or go back in its implementation)
    }
}

您可以使用此自定义EditText来解决此错误。键盘打开/关闭后刷新错误,弹出窗口将始终正确显示。

您必须在类中实现close(finish或onBackPressed)并重新验证edittext方法。