Android: ошибка всплывающего окна на EditText не исчезает, когда клавиатура исчезает - PullRequest
12 голосов
/ 17 июня 2011

У меня есть действие, которое отображает несколько EditTexts на экране для ввода пользователя. Чтобы экранная клавиатура не закрывала мои поля при отображении, я установил свойство

android:windowSoftInputMode="adjustPan"

за мою активность в манифесте. Я проверяю содержимое EditText, когда 1. Представление теряет фокус 2. Когда пользователь выполняет действие «Ввод». После проверки, если значение недействительно, я звоню

setError(CharSequence error)

в EditText, который вызывает всплывающее окно, содержащее ошибку, которую я передал. Проблема в том, что если EditText перемещается вверх, когда отображается экранная клавиатура, и всплывающее окно отображается в это время (проверка не удалась), всплывающее окно не следует за тэгом EditText, когда клавиатура исчезает, оно остается там, где оно было впервые отображено.

Есть идеи как это исправить? Это ошибка в Android?

Ответы [ 5 ]

10 голосов
/ 28 июня 2011

Если это то, что вы описали, я думаю, что это может быть подлинной ошибкой, поэтому, возможно, стоит написать об этом на сайте Android Source .

Так что, очевидно, я могу думать толькообходных путей взлома!

Переопределение при исчезновении клавиатуры :

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

2 голосов
/ 10 февраля 2014

Вы также можете создать свой собственный 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;
    }
}
1 голос
/ 27 августа 2012

Для меня это помогло обернуть макет в ScrollView.После этого вся прокрутка setError-box работала нормально.

0 голосов
/ 14 декабря 2015

Я нашел РЕШЕНИЕ!

Вот код:

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)
    }
}

Вы можете использовать этот Custom EditText для решения этой ошибки.Он обновляет сообщение об ошибке после открытия / закрытия клавиатуры, и ваше всплывающее окно всегда будет отображаться правильно.

Вы должны реализовать методы close (finish или onBackPressed) и повторно проверить методы edittext в вашем классе.

0 голосов
/ 04 июля 2011

Вы пытались проверить ваше представление, то есть вызываете метод invalidate () вашего представления.

попробуй editText.invalidate();

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...