Программно открыть программную клавиатуру

У меня есть действие без дочерних виджетов для него, и соответствующий файл xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myLayout"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:focusable="true"
>
</LinearLayout>

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

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (inputMethodManager != null) {
        inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }

Дай мне какое-нибудь руководство.


person Vignesh    schedule 08.04.2011    source источник
comment
привет виньеш а зачем открывать мягкую клавиатуру без всякого textView?   -  person milind    schedule 08.04.2011
comment
На самом деле я пытаюсь использовать ключевой слушатель в этой деятельности, для этого мне нужно это сделать.   -  person Vignesh    schedule 08.04.2011
comment
То, что вы сделали, правильно. Я не уверен, почему вы не видите клавиатуру. Я использовал этот код один раз, чтобы запустить клавиатуру без каких-либо действий пользователя с editText, и это было успешно.   -  person Vinoth    schedule 08.04.2011
comment
Привет, Винот, я изменил свой код так же, как и сообщения DSouza, и я тоже обновил свой вопрос, поэтому проверьте, есть ли что-нибудь, что мне нужно изменить.   -  person Vignesh    schedule 08.04.2011


Ответы (22)


Я использовал следующие строки, чтобы вручную отобразить программную клавиатуру внутри события onclick, и клавиатура видна.

InputMethodManager inputMethodManager =
    (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInputFromWindow(
    linearLayout.getApplicationWindowToken(),
    InputMethodManager.SHOW_FORCED, 0);

Но я все еще не могу открыть это, пока открывается действие, есть ли какое-нибудь решение для этого?

person Vignesh    schedule 11.04.2011
comment
@YosiTaguri, гораздо элегантнее, если вы занимаетесь активностью. А что насчет фрагментов ?! +1 за оба ответа - person S.Thiongane; 19.02.2014
comment
а что делать, если вам нужно открыть клавиатуру в диалоге редактирования текста? Как это сделать? - person seema; 14.05.2014
comment
@Vignesh: вам нужно дать некоторую задержку, например, 500 миллисекунд, при открытии клавиатуры, если вы хотите реализовать этот код во время запуска активности. - person Vinit Saxena; 19.06.2016
comment
@vinitsaxena Спасибо за ваш ценный комментарий - person Vignesh; 20.06.2016
comment
я не уверен, но я попытался получить любое представление, например TextView и добавить слушателя, например, myTextView.post (new Runnable () {public void run () {// вот ваш метод}}); и когда это представление будет создано, это означает, что весь экран теперь виден, вы можете вызывать все, что хотите - person Aleksey Timoshchenko; 28.06.2016

В файле манифеста попробуйте добавить следующее к <activity>, который вы хотите отображать на клавиатуре при запуске действия:

android:windowSoftInputMode="stateVisible"

Это должно привести к тому, что клавиатура станет видимой при запуске действия.

Дополнительные возможности см. В документации.

person jemerick    schedule 13.10.2011
comment
Хотел бы я чаще голосовать за этот ответ, просто чтобы донести все эти грязные хаки до конца страницы;) - person fjdumont; 08.05.2012
comment
Как это сделать программно? Я хочу, чтобы клавиатура автоматически отображалась только в определенных ситуациях. - person phreakhead; 04.01.2013
comment
у меня есть диалоговое окно ввода, подобное этой ссылке ссылка, как отображать клавиатуру не по активности, а по запросу? это сработало, спасибо ‹code› InputMethodManager inputMethodManager = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); если (inputMethodManager! = null) {inputMethodManager.toggleSoftInput (InputMethodManager.SHOW_FORCED, 0); }<код> - person shareef; 11.05.2013
comment
Он говорит программно. - person Mert Akcakaya; 07.08.2013
comment
У меня это не работает. Вместо этого это делает: android: windowSoftInputMode = stateAlwaysVisible - person Rendicahya; 24.10.2013
comment
работает хорошо - особенно если вы знаете, что экрану всегда будет нужна (или не нужна) клавиатура - person Shaun Neal; 13.01.2014
comment
Отличный ответ. Я устал от ответов, в которых говорится, что нужно использовать runnable с таймаутом 300 мс для постоянного запроса фокуса. - person JakeWilson801; 18.04.2016

Пожалуйста, следуйте приведенному ниже коду. Я уверен, что ваша проблема будет решена.

if (imm != null){
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
   } 
person AndroidDanger    schedule 11.04.2011
comment
Привет, я только что вставил ваш код в функцию onCreate, но моя активность по-прежнему не изменилась. Если вы хотите, чтобы я вставил код, я вставлю комментарий. - person Vignesh; 11.04.2011
comment
Если вы хотите получить доступ к программной клавиатуре, сообщите мне, чтобы я решил вашу проблему. Пожалуйста, пришлите мне код .... если возможно - person AndroidDanger; 11.04.2011
comment
Я хочу установить onKeyboardActionListener для моей деятельности, которая не имеет ничего, кроме линейного макета. - person Vignesh; 11.04.2011
comment
Просто посмотрите мой вопрос выше, в котором я отредактировал код тем, что вы мне предоставили. - person Vignesh; 11.04.2011
comment
Это действие предназначено только для действий с клавиатуры, я хочу прослушивать каждую нажатую клавишу (используя onKeyboardActionListener), и я передам ее на локальный сервер одновременно. - person Vignesh; 11.04.2011
comment
Я знаю, что опаздываю на три года, но я считаю, что это решение правильное, если вы используете его внутри метода onCreateView. - person cbuchart; 14.02.2014

Это работает

<activity
    ...
    android:windowSoftInputMode="stateVisible" >
</activity>

or

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
person ahtartam    schedule 06.09.2013
comment
Спасибо за программный способ настройки - это работает, а хаки InputMethodManager - нет. - person Martin Vysny; 21.05.2014

Все, что мне нужно, - это открыть клавиатуру в очень точный момент. Это сработало для меня! Спасибо, Бенитес.

    private Handler mHandler= new Handler();

И в самый точный момент:

    mHandler.post(
    new Runnable() {
        public void run() {
            InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
            inputMethodManager.toggleSoftInputFromWindow(yourEditText.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);
            yourEditText.requestFocus();
        }
    }); 
person Diego Soto    schedule 24.08.2012
comment
Это решение сработало для меня внутри onResume () с небольшой модификацией по задержке действия публикации: postDelayed( runnable, 500 /* msec */ ); - person AVIDeveloper; 24.11.2013
comment
Я бы рекомендовал поместить его в обратный вызов ViewTreeObserver, чтобы он вызывался в первом макете, чтобы избежать ожидания произвольного количества времени. Он должен быть более безопасным / более отзывчивым. - person Gabriel; 17.04.2015
comment
Только это решение сработало для меня. У меня были предыдущие методы, которые раньше работали, но, к сожалению, для последней ОС, обработчик - работоспособное решение. - person MD. Shafiul Alam Biplob; 25.12.2019

Я использовал следующие строки для отображения виртуальной клавиатуры вручную внутри события onclick.

public void showKeyboard(final EmojiconEditText ettext){
          ettext.requestFocus();
          ettext.postDelayed(new Runnable(){
            @Override public void run(){
              InputMethodManager keyboard=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
              keyboard.showSoftInput(ettext,0);
            }
          }
        ,200);
        }
person Ram    schedule 09.01.2015
comment
Я боролся с этим часами. К счастью, ваше решение отлично работает! Спасибо, что поделился! - person Nick; 26.01.2021

Поместите это в метод onResume:

findViewById(R.id.root_view_of_your_activity_layout).post(
new Runnable() {
    public void run() {
        InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
        inputMethodManager.toggleSoftInputFromWindow(yourEditText.getApplicationWindowToken(),     InputMethodManager.SHOW_FORCED, 0);
        yourEditText.requestFocus();
    }
});

runnable необходим, потому что, когда ОС запускает метод onResume, вы не можете быть уверены, что все представления рисуются, поэтому метод post, вызываемый из вашего корневого макета, заставляет его ждать, пока все представления будут готовы.

person Marcelo Benites    schedule 19.07.2012
comment
У меня был SearchView в DialogFragment, и при первом появлении Dialog у SearchView был фокус ... но клавиатура НЕ была активирована, если пользователь не коснулся ее. Мы пытались просто использовать showSoftInput, а также toggleSoftInputFromWindow из OnResume ALONE ... или даже в OnFocusChangeListener для SearchView ... но ни один из них не работал, потому что они, казалось, срабатывали до того, как окно было поднято и нарисовано ... .использование этого сообщения в OnResume, наконец, решило эту проблему. - person lepert; 17.09.2013
comment
У меня был собственный текст редактирования в этом onAttachedToWindow() методе, который я только что назвал requestFocus(), он работал в фрагменте диалога, то же самое не работало в обычном фрагменте, не могу понять, почему? - person Abhinav Chauhan; 29.05.2021

похоже, что это работает

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_patientid);

        editText = (EditText)findViewById(R.id.selectPatient);
        //editText.requestFocus(); //works without that

    }

@Override
    protected void onResume() {

        findViewById(R.id.selectPatient).postDelayed(
        new Runnable() {
            public void run() {
                 editText.requestFocus();
                InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                inputMethodManager.showSoftInput(editText,InputMethodManager.SHOW_IMPLICIT);
            }
        },100);
        super.onResume();
    }

кажется, это работает лучше: в манифесте:

<application>
    <activity
        android:name="com.doodkin.myapp.ReportActivity"
        android:label="@string/title_activity_report"
        android:screenOrientation="sensor" 
        android:windowSoftInputMode="stateHidden" > // add this or stateVisible
    </activity>
</application>

кажется, что манифест работает в Android 4.2.2, но не работает в Android 4.0.3

person Shimon Doodkin    schedule 04.07.2014

в методе действия onCreate или onActivityCreated фрагмента

....
view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        @Override
        public boolean onPreDraw() {
            view.removeOnPreDrawListener(this);
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

            // !Pay attention to return `true`
            // Chet Haase told to 
            return true;
        }
    });
person Alex    schedule 06.02.2015

Котлин

fun hideKeyboard(activity: Activity) {
    val view = activity.currentFocus
    val methodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.hideSoftInputFromWindow(view!!.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}

private fun showKeyboard(activity: Activity) {
    val view = activity.currentFocus
    val methodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}

Джава

public static void hideKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager methodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert methodManager != null && view != null;
    methodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}

private static void showKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager methodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert methodManager != null && view != null;
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}
person Khemraj Sharma    schedule 01.10.2018

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

В манифесте:

<activity android:name="XXXActivity" android:windowSoftInputMode="adjustPan">
</activity>

В XXXActvity:

EditText et =  (EditText))findViewById(R.id.edit_text);  
  Timer timer = new Timer();
            TimerTask task = new TimerTask() {

                @Override
                public void run() {
                    InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                    inputMethodManager.toggleSoftInputFromWindow(et.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);

                }
            };
            timer.schedule(task, 200);

Я предполагаю, что это сэкономит время другим на поиски этой проблемы.

person Noundla Sandeep    schedule 14.10.2012
comment
Работает, но клавиатура остается видимой, даже если вы выйдете из приложения, и как только вы закроете клавиатуру, если вы снова откроете приложение, клавиатура не появится - person nulll; 29.07.2013
comment
До сих пор я не сталкивался с этой проблемой. Я предполагаю, что это проблема устройства. - person Noundla Sandeep; 30.07.2013
comment
Зачем нужен таймер? Можете ли вы добавить ссылки, чтобы углубиться? - person nulll; 31.07.2013

Я использовал его как синглтон, например:

public static void showSoftKeyboard(final Context context, final EditText editText) {
        try {
            editText.requestFocus();
            editText.postDelayed(
                    new Runnable() {
                        @Override
                        public void run() {
                            InputMethodManager keyboard = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
                            keyboard.showSoftInput(editText, 0);
                        }
                    }
                    , 200);
        } catch (NullPointerException npe) {
            npe.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

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

showSoftKeyboard(this, yourEditTextToFocus);
person Shailendra Madda    schedule 01.12.2017
comment
Большое спасибо за то, что вы добавили короткий фрагмент о том, как использовать функцию, а также саму функцию. Он работает именно так, как мне нужно! - person Chad Wilson; 26.04.2020

Это работает:

private static void showKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

И вы вызываете этот метод так:

showKeyboard(NameOfActivity.this);
person Thiago Silva    schedule 24.02.2019

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

Используйте приведенный выше код в onResume (), чтобы открыть мягкую клавиатуру

person Sanket Parchande    schedule 29.06.2017

InputMethodManager.SHOW_FORCED - не лучший выбор. Если вы используете этот параметр, вы должны управлять скрытием состояния клавиатуры. Мое предложение таково;

    public void showSoftKeyboard(View view) {
    InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
    view.requestFocus();
    inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
}

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

для получения дополнительной информации о InputMethodManager.SHOW_IMPLICIT и SHOW_FORCED; InputMethodManager

person Cafer Mert Ceyhan    schedule 28.03.2019

Это необходимый исходный код:

public static void openKeypad(final Context context, final View v) 
 {
new Handler().postDelayed(new Runnable() 
{
    @Override
    public void run() 
    {
        InputMethodManager inputManager =   (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE); 
        inputManager.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);    
        Log.e("openKeypad", "Inside Handler");
    }
},300);}

Для получения подробной информации перейдите по этой ссылке. Это мне помогло. https://github.com/Nikhillosalka/Keyboard/blob/master/README.md

person Nikhil Losalka    schedule 29.04.2015

Подобно ответу @ShimonDoodkin, это то, что я сделал во фрагменте.

https://stackoverflow.com/a/29229865/2413303

    passwordInput.postDelayed(new ShowKeyboard(), 300); //250 sometimes doesn't run if returning from LockScreen

Где ShowKeyboard

private class ShowKeyboard implements Runnable {
    @Override
    public void run() {
        passwordInput.setFocusableInTouchMode(true);
        passwordInput.requestFocus();            
        getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(passwordInput, 0);
    }
}

После успешного ввода я также убеждаюсь, что скрываю клавиатуру

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE))
                    .hideSoftInputFromWindow(getView().getWindowToken(), 0);
person EpicPandaForce    schedule 24.03.2015

отлично работающий код для отображения и скрытия программной клавиатуры для edittextbox .....

// code to hide soft keyboard
public void hideSoftKeyBoard(EditText editBox) {
     InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);  
     imm.hideSoftInputFromWindow(editBox.getWindowToken(), 0);  
}




// code to show soft keyboard
private void showSoftKeyBoard(EditText editBox){
     InputMethodManager inputMethodManager = (InputMethodManager) this.getSystemService(Activity.INPUT_METHOD_SERVICE);
     editBox.requestFocus();
     inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}
person YESVGO JOBS    schedule 17.08.2020

Ответов уже слишком много, но у меня ничего не работало, кроме этого

inputMethodManager.showSoftInput(emailET,InputMethodManager.SHOW_FORCED);

Я использовал showSoftInput с SHOW_FORCED

И моя деятельность

 android:windowSoftInputMode="stateVisible|adjustResize"

надеюсь, это поможет кому-то

person spaceMonkey    schedule 05.03.2017

Опубликуйте этот метод в своем базовом действии и используйте его в других занятиях, например, в чарте.

public void openKeyboard() {
    InputMethodManager imm =
            (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }
}
person Ajay Chauhan    schedule 17.06.2018

Мне нравится делать это как расширение контекста, чтобы вы могли вызывать его где угодно

fun Context.showKeyboard(editText: EditText) {
    val inputMethodManager: InputMethodManager =
        getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    inputMethodManager.toggleSoftInputFromWindow(
        editText.applicationWindowToken,
        InputMethodManager.SHOW_IMPLICIT, 0
    )
    editText.requestFocus()
    editText.setSelection(editText.text.length)
}

fun Context.hideKeyboard(editText: EditText) {
    val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(editText.windowToken, 0)
}
person Sean Calkins    schedule 25.08.2020

Основываясь на приведенных выше ответах, он работает в KOTLIN, если у вас есть контекст.

fun Context.showKeyboard(editText: EditText) {

    editText.requestFocus()
    editText.setSelection(editText.text.length)

    GlobalScope.launch {
        delay(200L)

        val inputMethodManager: InputMethodManager =
            getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        inputMethodManager.toggleSoftInputFromWindow(
            editText.applicationWindowToken,
            InputMethodManager.SHOW_IMPLICIT, 0
        )
    }
}

Затем вы можете вызвать его в своем фрагменте, например, следующим образом

requireContext (). showKeyboard (binding.myEditText)

person F.Mysir    schedule 05.01.2021