Программное открытие программной клавиатуры


117

У меня есть действие без дочерних виджетов для него, и соответствующий файл 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);
    }

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


привет виньеш, а зачем открывать мягкую клавиатуру без textView?
milind

На самом деле я пытаюсь использовать ключевой слушатель в этой деятельности, для этого мне нужно это сделать.
Vignesh

То, что вы сделали, правильно. Я не уверен, почему вы не видите клавиатуру. Я использовал этот код один раз для запуска клавиатуры без каких-либо действий пользователя над editText, и это было успешно.
Винот

Привет, Винот, я изменил свой код так же, как и сообщения DSouza, и я тоже обновил свой вопрос, поэтому проверьте, есть ли что-нибудь, что мне нужно изменить.
Vignesh

Ответы:


146

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

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

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


@YosiTaguri, гораздо элегантнее, если вы занимаетесь активностью. А что насчет фрагментов ?! +1 за оба ответа
S.Thiongane

а что если вам нужно открыть клавиатуру в диалоге редактирования текста? Как это сделать?
seema

5
@Vignesh: вам нужно дать некоторую задержку, например, 500 миллисекунд, при открытии клавиатуры, если вы хотите реализовать этот код во время запуска активности.
Vinit Saxena

@vinitsaxena Спасибо за ваш ценный комментарий
Vignesh

я не уверен, но я попытался получить любое представление, например TextView и добавить слушателя, например, myTextView.post (new Runnable () {public void run () {// вот ваш метод}}); и когда это представление будет создано, это означает, что весь экран видим, теперь вы можете называть как хотите,
Алексей Тимощенко

121

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

android:windowSoftInputMode="stateVisible"

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

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


3
Хотел бы я чаще голосовать за этот ответ, просто чтобы все эти грязные хаки
дошли

Как это сделать программно? Я хочу, чтобы клавиатура автоматически отображалась только в определенных ситуациях.
phreakhead 03

1
У меня есть входной диалог , как эта ссылка ссылку , как показать клавиатуры не на активность , а на приглашение? это сработало, спасибо <code> InputMethodManager inputMethodManager = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); если (inputMethodManager! = null) {inputMethodManager.toggleSoftInput (InputMethodManager.SHOW_FORCED, 0); } <code>
shareef

7
Он говорит «программно».
Мерт Акчакая 07

2
У меня это не работает. Вместо этого: android: windowSoftInputMode = "stateAlwaysVisible"
Rendicahya

34

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

if (imm != null){
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
   } 

Привет, я только что вставил ваш код в функцию onCreate, но в моей деятельности все еще нет изменений, если вы хотите, чтобы я вставил код, я вставлю комментарий.
Vignesh

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

Я хочу установить onKeyboardActionListener для моей деятельности, которая не имеет ничего, кроме линейного макета.
Vignesh

Просто посмотрите мой вопрос выше, в котором я отредактировал код тем, что вы мне предоставили.
Vignesh

Это действие предназначено только для действий с клавиатуры, я хочу прослушивать каждую нажатую клавишу (используя onKeyboardActionListener), и я передам его на локальный сервер одновременно
Виньеш

25

Это работает

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

или

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

2
Спасибо за программный способ настройки - это работает, а хаки InputMethodManager - нет.
Мартин Высный

17

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

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

Это решение сработало для меня внутри onResume () с небольшой модификацией по задержке действия публикации: postDelayed( runnable, 500 /* msec */ );
AVIDeveloper

1
Я бы рекомендовал поместить его в обратный вызов ViewTreeObserver, чтобы он вызывал первый макет, чтобы избежать ожидания произвольного количества времени. Он должен быть более безопасным / более отзывчивым.
Габриэль

Только это решение сработало для меня. У меня были предыдущие методы, которые раньше работали, но, к сожалению, для последней ОС, обработчик - работоспособное решение.
МД. Шафиул Алам Биплоб

12

Я использовал следующие строки для отображения виртуальной клавиатуры вручную внутри события 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);
        }

9

Поместите это в метод 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, вызываемый из вашего корневого макета, заставляет его ждать, пока все представления будут готовы.


1
У меня был SearchView в DialogFragment, и при первом появлении Dialog у SearchView был фокус ... но клавиатура НЕ была активирована, если пользователь не коснулся ее. Мы пытались просто использовать showSoftInput, а также toggleSoftInputFromWindow ТОЛЬКО из OnResume ... или даже в OnFocusChangeListener для SearchView ... но ни один из них не работал, потому что они, казалось, срабатывали до того, как окно было поднято и нарисовано ... .использование этого сообщения в OnResume, наконец, решило эту проблему.
lepert

8

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

 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


8

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

6

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

В манифесте:

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

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


Работает, но клавиатура остается видимой, даже если вы выходите из приложения, и как только вы закроете клавиатуру, если снова откроете приложение, клавиатура не появится
nulll

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

Зачем нужен таймер? Можете ли вы добавить ссылки, чтобы углубиться?
nulll

6

Котлин

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

3
InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

3

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

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

Большое спасибо за то, что вы добавили небольшой фрагмент о том, как использовать функцию, а также саму функцию. Он работает именно так, как мне нужно!
Чад Уилсон,

3

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

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

2

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


1

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

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


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

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


1

Подобно ответу @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);

1
public final class AAUtilKeyboard {

public static void openKeyboard(final Activity activity, final EditText editText) {
    final InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
}

public static void hideKeyboard(final Activity activity) {
    final View view = activity.getCurrentFocus();
    if (view != null) {
        final InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm != null) {
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }
}

0

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

inputMethodManager.showSoftInput(emailET,InputMethodManager.SHOW_FORCED);

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

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

 android:windowSoftInputMode="stateVisible|adjustResize"

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


0

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

public void openKeyboard() {
    InputMethodManager imm =
            (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.