Android показать softkeyboard с showSoftInput не работает?

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

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

Я пробовал различные настройки "состояния" в манифесте и разные флаги в коде для 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);
    }
}

9 ответов


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

Первый Способ

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

Второй способ

в onCreate, чтобы запустить его на activity create

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

Третий Способ Добавьте данный код в тег activity в Манифесте. Он покажет клавиатуру на старте, и установит первое фокус на вид желание.

android:windowSoftInputMode="stateVisible"

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

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

imm.toggleSoftInput(0, 0);

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


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


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

editText1.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
          imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

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

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

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

:

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

устранение:

Я использую следующий класс. Это продолжает работать, каждые 100 мс пока клавиатура не будет успешно показана. Он выполняет различные проверки в каждой итерации. Некоторые проверки могут остановить runnable, некоторые публикуют его после 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, который будет иметь ввод с клавиатуры и фокус впоследствии. Затем опубликуйте экземпляр с помощью обработчика.


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


это работает для меня:

public void requestFocusAndShowSoftInput(View view){
    view.requestFocus();
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
    inputMethodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}

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

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