2011-06-16 69 views
12

我有一个活动,在屏幕上显示一些用于用户输入的EditTexts。可以肯定的软键盘不包括我的领域时,它会显示我已经设置了属性Android:当键盘消失时,EditText上的弹出菜单不会向下移动

android:windowSoftInputMode="adjustPan" 

我在清单活动。我在1时验证EditText的内容。视图失去焦点2.当用户执行“Enter”操作时。经确认,如果值是无效的,我的EditText上,这会导致一个弹出显示包含我通过了错误调用

setError(CharSequence error) 

。问题是,如果EditText上向上移动软键盘显示时,并且当时显示弹出窗口(验证失败),弹出窗口不会在键盘消失时跟随EditText向下,它会保持在第一次显示的位置。

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

回答

10

如果这是你所描述的,我认为这可能是一个真正的bug,所以可能值得写在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

这不适合我。当软键盘启动时,我的EditText位于键盘上方,错误消息也是如此。当他们的键盘消失时,EditText向下移动,并且该消息仍然是它最初显示的位置。我需要在键盘消失后重新验证,并且EditText已经移到了新的位置。 – 2011-07-26 01:21:32

+0

你可以自己隐藏键盘http://stackoverflow.com/questions/1109022/how-to-close-hide-the-android-soft-keyboard,然后做revalidateEditText(); – Blundell 2011-07-26 07:19:00

0

您是否尝试过验证你的观点,即调用无效您的视图()方法。

尝试editText.invalidate();

感谢。

+0

我试过了,并没有工作。 – Sadegh 2014-07-18 16:37:00

1

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

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; 
    } 
} 
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方法。

+0

请在答案中添加您的解决方案。链接可能会超模。 – CuriousSuperhero 2015-12-14 13:51:50

+1

好,已编辑。谢谢 – 2015-12-14 13:55:19

相关问题