Подтвердить что ты не робот

Android-дисплей софт-клавиатурой с showSoftInput не работает?

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

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

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

Ответ 1

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

Ответ 2

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

Первый метод

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

Третий метод ADD присваивает код тегу активности в манифесте. Он покажет клавиатуру при запуске и настроит первый фокус на ваш желаемый вид.

android:windowSoftInputMode="stateVisible"

Ответ 3

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

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

imm.toggleSoftInput(0, 0);

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

Проблема:

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

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

Ответ 11

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

}