Android show softkeyboard с showSoftInput не работает? - PullRequest
22 голосов
/ 02 апреля 2011

Я создал тривиальное приложение для проверки следующих функций. Когда моя активность запускается, она должна запускаться с открытой программной клавишей.

Мой код не работает?!

Я пробовал различные настройки "состояния" в манифесте и различные флаги в коде для InputMethodManager (imm).

Я включил этот параметр в AndroidManifest.xml и явно вызвал в onCreate единственного действия.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.mycompany.android.studyIme"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="7" />

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".StudyImeActivity"
                  android:label="@string/app_name" 
                  android:windowSoftInputMode="stateAlwaysVisible">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>

... основной макет (main.xml) ...

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <TextView  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/hello"
        />
    <EditText
        android:id="@+id/edit_sample_text"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:hint="@string/hello"
        android:inputType="textShortMessage"
    />
</LinearLayout>

... и код ...

public class StudyImeActivity extends Activity {
    private EditText mEditTextStudy;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mEditTextStudy = (EditText) findViewById(R.id.edit_study);
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(mEditTextStudy, InputMethodManager.SHOW_FORCED);
    }
}

Ответы [ 11 ]

32 голосов
/ 18 декабря 2014

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

Первый метод

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
editText.postDelayed(new Runnable()
{
    @Override
    public void run()
    {
        editText.requestFocus();
        imm.showSoftInput(editText, 0);
    }
}, 100);

Второй метод

в onCreate, чтобы запустить его при действии, создать

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() 
    {
    //  InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    //    inputMethodManager.toggleSoftInputFromWindow(EnterYourViewHere.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);

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

Третий метод ДОБАВИТЬ данокод для тега активности в манифесте.Он покажет клавиатуру при запуске и установит первый фокус в соответствии с вашим желанием.

android:windowSoftInputMode="stateVisible"
19 голосов
/ 29 июня 2011

Эй, я надеюсь, что вы все еще ищете ответ, который я нашел при тестировании моего кода.вот код:

InputMethodManager imm = (InputMethodManager)_context.getSystemService(Context.INPUT_METHOD_SERVICE);

imm.toggleSoftInput(0, 0);

Вот мой вопрос, на который был дан ответ: android - показать программную клавиатуру по запросу

18 голосов
/ 22 февраля 2013

Это работало со мной на телефоне с жесткой клавиатурой:

editText1.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
          imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
17 голосов
/ 03 апреля 2011

Это так тонко, что преступно. Это работает на телефонах, которые НЕ имеют жесткую выдвижную клавиатуру. Телефоны с жесткой клавиатурой не открываются автоматически при этом вызове. У моего LG и старого Nexus One нет клавиатуры - поэтому программная клавиатура открывается при запуске упражнения (именно этого я и хочу), но телефоны MyTouch и HTC G2 с выдвижными клавиатурами не открывают программную клавиатуру. клавиатуры, пока я не коснусь поля редактирования с закрытой жесткой клавиатурой.

9 голосов
/ 22 июня 2016

Этот ответ может быть поздно, но он отлично работает для меня. Может, кому-то это поможет :)

public void showSoftKeyboard(View view) {
    if (view.requestFocus()) {
        InputMethodManager imm = (InputMethodManager)
                getSystemService(Context.INPUT_METHOD_SERVICE);
        boolean isShowing = imm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
        if (!isShowing)
            getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    }
}

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

InputMethodManager.SHOW_FORCED
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
3 голосов
/ 16 ноября 2018

Следующее сработало у меня:

    mEditTextStudy.requestFocus();
    mEditTextStudy.post(
            new Runnable() {
                @Override
                public void run() {
                    InputMethodManager imm =
                            (InputMethodManager)
                                    getActivity()
                                            .getSystemService(Context.INPUT_METHOD_SERVICE);
                    if (imm != null) {
                        imm.showSoftInput(mEditTextStudy, SHOW_FORCED);
                    }
                }
            });
2 голосов
/ 20 апреля 2017

Отображение Soft Keyboard - большая проблема.Я много искал, чтобы прийти к окончательному выводу.Благодаря этому ответу, который дал несколько подсказок: https://stackoverflow.com/a/16882749/5903344

Проблема:

Обычно мы вызываем showSoftInput, как только мы инициализируем представления.В Деятельности это в основном в onCreate, во Фрагментах onCreateView.Чтобы показать клавиатуру, IMM должен иметь активную функцию focsedView.Это можно проверить с помощью метода isActive (view) IMM.Если мы вызываем showSoftInput во время создания представлений, есть большая вероятность, что представление не будет активным для IMM.Вот почему иногда полезно использовать showSoftInput с задержкой в ​​50-100 мс.Однако это еще не гарантирует, что через 100 мс вид станет активным.Итак, в моем понимании, это снова взлом.

Решение:

Я использую следующий класс.Это продолжается каждые 100 мс, пока клавиатура не будет успешно показана.Он выполняет различные проверки в каждой итерации.Некоторые проверки могут остановить выполнение, некоторые публикуют его через 100 мс.

public class KeyboardRunnable extends Runnable
{
    // ----------------------- Constants ----------------------- //
    private static final String TAG = "KEYBOARD_RUNNABLE";

    // Runnable Interval
    private static final int INTERVAL_MS = 100;

    // ----------------------- Classes ---------------------------//
    // ----------------------- Interfaces ----------------------- //
    // ----------------------- Globals ----------------------- //
    private Activity parentActivity = null;
    private View targetView = null;

    // ----------------------- Constructor ----------------------- //
    public KeyboardRunnable(Activity parentActivity, View targetView)
    {
        this.parentActivity = parentActivity;
        this.targetView = targetView;
    }

    // ----------------------- Overrides ----------------------- //
    @Override
    public void run()
    {
        // Validate Params
        if ((parentActivity == null) || (targetView == null))
        {
            Dbg.error(TAG, "Invalid Params");
            return;
        }

        // Get Input Method Manager
        InputMethodManager imm = (InputMethodManager) parentActivity.getSystemService(Context.INPUT_METHOD_SERVICE);

        // Check view is focusable
        if (!(targetView.isFocusable() && targetView.isFocusableInTouchMode()))
        {
            Dbg.error(TAG, "Non focusable view");
            return;
        }
        // Try focusing
        else if (!targetView.requestFocus())
        {
            Dbg.error(TAG, "Cannot focus on view");
            Post();
        }
        // Check if Imm is active with this view
        else if (!imm.isActive(targetView))
        {
            Dbg.error(TAG, "IMM is not active");
            Post();
        }
        // Show Keyboard
       else if (!imm.showSoftInput(targetView, InputMethodManager.SHOW_IMPLICIT))
        {
            Dbg.error(TAG, "Unable to show keyboard");
            Post();
        }
    }

    // ----------------------- Public APIs ----------------------- //
    public static void Hide(Activity parentActivity)
    {
        if (parentActivity != null)
        {
            InputMethodManager imm = (InputMethodManager) parentActivity.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(parentActivity.findViewById(android.R.id.content).getWindowToken(), 0);
        }
        else
        {
            Dbg.error(TAG, "Invalid params to hide keyboard");
        }
    }

    // ----------------------- Private APIs ----------------------- //
    protected void Post()
    {
        // Post this aftr 100 ms
        handler.postDelayed(this, INTERVAL_MS);
    }
}

Чтобы использовать это, просто создайте экземпляр этого класса.Передайте ему родительское действие и targetView, который будет иметь клавиатурный ввод и фокус после этого.Затем опубликуйте экземпляр с помощью обработчика.

1 голос
/ 05 августа 2015

Мой код имеет переключатель в нем, но не postDelayed.Я пробовал postDelayed для showSoftInput безуспешно, и с тех пор я пробовал ваше предлагаемое решение.Я собирался отказаться от него как еще одного неудачного потенциального решения, пока не решил увеличить время задержки.Он работает для меня вплоть до 200 мс, после чего он не работает, по крайней мере, на физических телефонах.Поэтому, прежде чем вы, бедные разработчики Android, откажетесь от этого ответа, попробуйте увеличить задержку для успешного решения.Это может стоить добавить немного для старых медленных телефонов.Спасибо огромное, работал над этим часами.

0 голосов
/ 05 июня 2019

Если вы пытаетесь отобразить программную клавиатуру во фрагменте, вам нужно подождать, пока действие не будет создано, прежде чем вызывать showSoftInput().Пример кода:

public class SampleFragment extends Fragment {

    private InputMethodManager mImm;
    private TextView mTextView;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mImm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        showSoftKeyboard(mTextView);
    }

    /**
     * Request the InputMethodManager show the soft keyboard.  Call this in {@link #onActivityCreated(Bundle)}.
     * @param view the View which would like to receive text input from the soft keyboard
     */
    public void showSoftKeyboard(View view) {
        if (view.requestFocus()) {
            mImm.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
        }
    }

}
0 голосов
/ 12 августа 2018

Решение для разработчиков Xamarin (_digit1 == EditText):

        var focussed = _digit1.RequestFocus();
        if (focussed)
        {
            Window.SetSoftInputMode(SoftInput.StateAlwaysVisible);
            var imm = (InputMethodManager)GetSystemService(InputMethodService);
            imm.ToggleSoftInput(ShowFlags.Forced, 0);
        }
...