我发现了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方法。
这不适合我。当软键盘启动时,我的EditText位于键盘上方,错误消息也是如此。当他们的键盘消失时,EditText向下移动,并且该消息仍然是它最初显示的位置。我需要在键盘消失后重新验证,并且EditText已经移到了新的位置。 – 2011-07-26 01:21:32
你可以自己隐藏键盘http://stackoverflow.com/questions/1109022/how-to-close-hide-the-android-soft-keyboard,然后做revalidateEditText(); – Blundell 2011-07-26 07:19:00