【问题标题】:Android: Error popup on EditText doesn't move down when keyboard goes awayAndroid:当键盘消失时,EditText 上的错误弹出窗口不会向下移动
【发布时间】:2023-04-04 00:30:01
【问题描述】:

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

android:windowSoftInputMode="adjustPan"

对于清单中的我的活动。我正在验证 EditText 的内容 1. 视图失去焦点 2. 当用户执行“输入”操作时。验证后,如果该值无效,我将调用

setError(CharSequence error)

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

关于如何解决这个问题的任何想法?这是 Android 的错误吗?

【问题讨论】:

    标签: android popup android-edittext


    【解决方案1】:

    如果这与您描述的一样,我认为这可能是一个真正的错误,因此值得将其写在 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

    【讨论】:

    • 这对我不起作用。当软键盘启动时,我的 EditText 在键盘上方,错误消息也是如此。当他们的键盘消失时,EditText 向下移动,并且消息仍然是最初显示的位置。我需要在键盘消失后重新验证,并且 EditText 已经移动到它的新位置。
    • 你可以自己隐藏键盘stackoverflow.com/questions/1109022/… 然后revalidateEditText();
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      对我来说,它有助于将布局包装在 ScrollView 中。在此之后,setError-box 的所有滚动都正常工作。

      【讨论】:

        【解决方案4】:

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

        试试editText.invalidate();

        谢谢。

        【讨论】:

          【解决方案5】:

          我找到了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 方法。

          【讨论】:

          • 请在答案中添加您的解决方案。链接可能会过时。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-14
          • 1970-01-01
          • 1970-01-01
          • 2013-02-27
          • 1970-01-01
          相关资源
          最近更新 更多