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

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"

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

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

jemerick
источник
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);
   } 
AndroidDanger
источник
Привет, я только что вставил ваш код в функцию onCreate, но в моей деятельности все еще нет изменений, если вы хотите, чтобы я вставил код, я вставлю комментарий.
Vignesh
Если вы хотите получить доступ к программной клавиатуре, сообщите мне, чтобы я решил вашу проблему. Пожалуйста, пришлите мне код .... если возможно
AndroidDanger
Я хочу установить onKeyboardActionListener для моей деятельности, которая не имеет ничего, кроме линейного макета.
Vignesh
Просто посмотрите мой вопрос выше, в котором я отредактировал код тем, что вы мне предоставили.
Vignesh
Это действие предназначено только для действий с клавиатуры, я хочу прослушивать каждую нажатую клавишу (используя onKeyboardActionListener), и я передам его на локальный сервер одновременно
Виньеш
25

Это работает

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

или

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
ahtartam
источник
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();
        }
    }); 
DiegoSoto
источник
Это решение сработало для меня внутри 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;
        }
    });
Alex
источник
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);
}
Khemraj
источник
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 (), чтобы открыть мягкую клавиатуру

Sanket Parchande
источник
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);
EpicPandaForce
источник
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"

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

spaceMonkey
источник
0

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

public void openKeyboard() {
    InputMethodManager imm =
            (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }
}
Аджай Чаухан
источник