Android:当键盘消失时,EditText上的弹出菜单不会向下移动
我有一个活动,在屏幕上显示一些用于用户输入的EditTexts。可以肯定的软键盘不包括我的领域时,它会显示我已经设置了属性Android:当键盘消失时,EditText上的弹出菜单不会向下移动
android:windowSoftInputMode="adjustPan"
我在清单活动。我在1时验证EditText的内容。视图失去焦点2.当用户执行“Enter”操作时。经确认,如果值是无效的,我的EditText上,这会导致一个弹出显示包含我通过了错误调用
setError(CharSequence error)
。问题是,如果EditText上向上移动软键盘显示时,并且当时显示弹出窗口(验证失败),弹出窗口不会在键盘消失时跟随EditText向下,它会保持在第一次显示的位置。
有关如何解决此问题的任何想法?这是Android中的错误吗?
如果这是你所描述的,我认为这可能是一个真正的bug,所以可能值得写在Android Source site。
很显然,我只能想到黑客的工作!
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,解散你的错误对话框,并重新显示它。
那声音怎么样?
您是否尝试过验证你的观点,即调用无效您的视图()方法。
尝试editText.invalidate();
感谢。
我试过了,并没有工作。 – Sadegh 2014-07-18 16:37:00
对我而言,它有助于将布局包装在ScrollView
中。在此之后,setError-box的所有滚动工作正常。
您还可以创建自定义的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;
}
}
我发现了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方法。
请在答案中添加您的解决方案。链接可能会超模。 – CuriousSuperhero 2015-12-14 13:51:50
好,已编辑。谢谢 – 2015-12-14 13:55:19
这不适合我。当软键盘启动时,我的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