Принудительное открытие Soft Keyboard - PullRequest
45 голосов
/ 19 марта 2010

Я пытаюсь принудительно открыть Soft Keyboard в Activity и захватить все, что введено, так как я хочу обрабатывать ввод самостоятельно, у меня нет EditText. В настоящее время я пробовал это, но это не работает. Мне бы хотелось, чтобы программная клавиатура открывалась ниже mAnswerTextView (Примечание: это TextView, а не EditText).

    InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    // only will trigger it if no physical keyboard is open
    mgr.showSoftInput(mAnswerTextView, InputMethodManager.SHOW_IMPLICIT);
  1. как принудительно открыть мягкую клавиатуру
  2. Как мне получить все, что введено, чтобы я мог обрабатывать каждый символ. Я хотел бы сбросить каждый символ с Soft Keyboard после того, как я обработал его. т. е. пользователь не должен иметь возможность вводить целые слова в программной клавиатуре.

Ответы [ 11 ]

127 голосов
/ 08 августа 2011

попробуйте открыть принудительную клавиатуру:

((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);

тогда вы можете использовать этот код для закрытия клавиатуры:

((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(_pay_box_helper.getWindowToken(), 0);
15 голосов
/ 19 марта 2010

Возможно, вам понадобится редактируемая текстовая область, чтобы сфокусироваться. Возможно, у вас может быть один невидимый или прозрачный фон без курсора. Возможно, вам придется поиграть с настройками фокусировки для вида.

Используйте TextWatcher для проверки изменений в этом EditText с помощью addTextChangedListener , или, если вам нужен хук еще более низкого уровня, установите прослушиватель ключа textview с помощью метода setOnKeyListener (). См. Документацию KeyListener .

Используйте этот вызов для принудительного открытия программной клавиатуры:

((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE))
    .showSoftInput(myEditText, InputMethodManager.SHOW_FORCED);

и этот, чтобы закрыть его:

((InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE))
    .hideSoftInputFromWindow(myEditText.getWindowToken(), 0);

обратите внимание, что это на самом деле не рекомендуется - принудительное открывание клавиатуры немного грязно. Каков ваш вариант использования, который действительно требует ввода пользовательского ввода без обычного поля редактирования и требует, чтобы пользователь вводил данные по каждому ключу, не возвращая его назад?

8 голосов
/ 08 декабря 2012

Чтобы заставить клавиатуру открыться, я использовал

this.getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE);

, у меня это сработало.

5 голосов
/ 14 августа 2014

Иногда другие ответы не будут работать.
Вот еще один способ ..

Это заставит клавиатуру показать, когда начинается действие, при прослушивании фокуса окна.onWindowFocusChanged() он очистит и запросит фокусировку EditText, затем установит режим мягкого ввода видимым и установит выделение для текста в поле.Это всегда должно работать, если вы вызываете его из действия.

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
        mEditText.clearFocus();
        mEditText.requestFocus();
        getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE);
        mEditText.setSelection(mEditText.getText().toString().length());
    }
}

Вам также может понадобиться

mEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (hasFocus) {
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.showSoftInput(mEditText, InputMethodManager.SHOW_IMPLICIT);
            }
        }
    });

Редактировать: Я также видел, что клавиатураоткрывайте вложенные фрагменты, остерегайтесь подобных ситуаций.

1 голос
/ 30 мая 2016

К сожалению, как бы мне ни хотелось проголосовать за один из ответов, ни один из них не сработал для меня. Кажется, решение состоит в том, чтобы дождаться завершения фазы макета. В приведенном ниже коде обратите внимание, как я проверяю, возвращает ли метод showKeyboard значение ИСТИНА, и именно тогда я удаляю прослушиватель глобального макета. Без этого это было ударом и мисс. Теперь, кажется, работает отлично.

В идеале вам нужно сделать следующее в onResume()

@Override
public void onResume()
{
    super.onResume();

    ViewTreeObserver vto = txtTaskTitle.getViewTreeObserver();
            vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener()
            {
                @Override
                public void onGlobalLayout()
                {
                    if (txtTaskTitle.requestFocus())
                    {
                        if (showKeyboard(getContext(), txtTaskTitle))
                        {
                            txtTaskTitle.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                        }
                    }
                }
            });
}

public static boolean showKeyboard(Context context, EditText target)
{
        if (context == null || target == null)
        {
            return false;
        }

        InputMethodManager imm = getInputMethodManager(context);

        ((InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(target, InputMethodManager.SHOW_FORCED);

        boolean didShowKeyboard = imm.showSoftInput(target, InputMethodManager.SHOW_FORCED);
        if (!didShowKeyboard)
        {
            didShowKeyboard = ((InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(target, InputMethodManager.SHOW_FORCED);
        }
        return didShowKeyboard;
}
1 голос
/ 23 февраля 2015

, если вы хотите контролировать программную клавиатуру внутри активности, используйте этот код:

//create soft keyboard object
InputMethodManager imm = (InputMethodManager)this.getSystemService(INPUT_METHOD_SERVICE);

//1.USE
your_view.setFocusableInTouchMode(true); //Enable touch soft keyboard to this view
//or
your_view.setFocusable(true); //Enable keyboard to this view
imm.showInputMethod(your_view, InputMethodManager.SHOW_IMPLICIT);

//2.USE show keyboard if is hidden or hide if it is shown
imm.toggleSoftInputFromWindow(your_view.getWindowToken(),InputMethodManager.SHOW_IMPLICIT, InputMethodManager.HIDE_IMPLICIT_ONLY);
//or
imm.toggleSoftInputFromWindow(InputMethodManager.SHOW_IMPLICIT, InputMethodManager.HIDE_IMPLICIT_ONLY);

//3.USE (you cannot control imm)
this.getWindow().setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE);

//4.USE (with Dialog)
Dialog d = new Dialog(this, android.R.style.Theme_Panel);
d.getWindow().setTitle(null);
d.setSoftInputMode(LayoutParams.SOFT_INPUT_STATE_VISIBLE);
d.setOnKeyListener(keyListener);
d.setCanceledOnTouchOutside(true);
d.setCancelable(true);
d.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
d.show();

//to hide keyboard call:
d.dismiss();
//if you want get soft keyboard visibility call:
d.isShowing();
0 голосов
/ 21 июня 2019

Для kotlin пользователя

Весь кредит идет на Ответ Дмитрия

Открыть клавиатуру во фрагменте .

Я передал переменную mainActivity в fragment constructor согласно моему требованию, возможно, этот хак / патч не рекомендуется согласно AndroidGuidLines (ну, я не знаю) .

Но мы идем ...

    @SuppressLint("ValidFragment")
    class MyDemoFragment(private val mainActivity: MainActivity) : Fragment() {

        // EditText declaration
        private lateinit var etMyEditText: EditText

        override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
            val view = inflater.inflate(R.layout.fragment_my_demo, container, false)

            // EditText initialisation
            etMyEditText = view.findViewById(R.id.etMyEditText)
            // This line will open KeyBoard
            (mainActivity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager).toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY)
            // Requesting cursor focus   
            etMyEditText.requestFocus()

            return view
        }
    }
0 голосов
/ 05 июля 2017

Проще говоря, добавление 2 строк будет работать как шарм:

При использовании XML

android:focusable="true"
android:focusableInTouchMode="true"

Иное в Java:

view.setFocusableInTouchMode(true);
view.requestFocus();
0 голосов
/ 08 ноября 2016

Отлично работает .........

edt_searchfilter_searchtext.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if(hasFocus){
                edt_searchfilter_searchtext.post(new Runnable() {
                    @Override
                    public void run() {
                        InputMethodManager imm = (InputMethodManager) getFragmentActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                        imm.showSoftInput(edt_searchfilter_searchtext, InputMethodManager.SHOW_IMPLICIT);
                    }
                });
            }
        }
    });

Вызов ниже линии, когда вы хотите открыть клавиатуру

 edt_searchfilter_searchtext.requestFocus();
0 голосов
/ 31 марта 2016

Я проверил, и это работает:

... // показать программную клавиатуру

imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

// чтобы скрыть это, снова вызвать метод

imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...