Скрытие softKeyboard при переопределении стандартной клавиатуры Android

Я пытаюсь переопределить мягкую клавиатуру ввода для единственного поля EditText. Я в основном следовал этому прекрасному примеру - установив XML в inputType="text", а затем в onCreate:

    EditText amount = (EditText) findViewById(R.id.amount_edit_text);
    final EditText amt = amount;
    amount.setOnFocusChangeListener(new OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {
                showCustomKeyboard(v);
            } else {
                hideCustomKeyboard();
            }
        }
    });

    amount.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            showCustomKeyboard(v);
        }
    });

    amount.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            EditText edittext = (EditText) v;
            int inType = edittext.getInputType();
            edittext.setInputType(InputType.TYPE_NULL);
            edittext.onTouchEvent(event);
            edittext.setInputType(inType);
            return true;
        }
    });

Это работает по большей части - нажатие на EditText вызывает мою пользовательскую клавиатуру, но всегда есть скачок. Это очень быстро, но он покажет мою клавиатуру поверх стандартной клавиатуры, а затем стандартная клавиатура рухнет, и моя клавиатура останется. И порой он произвольно не рухнет, а просто сложится...

Есть ли способ переопределить стандартную клавиатуру с моей без этого прыжка?

2 ответа

Решение

В итоге я использовал Runnable, чтобы закрыть стандартную клавиатуру, прежде чем показывать свою пользовательскую клавиатуру. Он не совсем идеален, но не сочетает в себе две клавиатуры, как раньше. Я буду продолжать искать лучшее решение, хотя.

в выражении else моего OnFocusChangeListener:

Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
    public void run() {                         
        showCustomKeyboard(v);
    } 
}, 250);

((InputMethodManager) getSystemService(Activity.INPUT_METHOD_SERVICE))
.hideSoftInputFromWindow(v.getWindowToken(), 0);

Попробуйте скрыть softKeyboard, когда вы показываете свою, используя следующий код:

InputMethodManager mgr = (InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.hideSoftInputFromWindow(amount.getWindowToken(), 0);
Другие вопросы по тегам