Как программно установить фокус (и отобразить клавиатуру) на моем EditText


180

У меня есть макет, который содержит некоторые виды, как это:

<LinearLayout>
<TextView...>
<TextView...>
<ImageView ...>
<EditText...>
<Button...>
</linearLayout>

Как я могу установить фокус (дисплей клавиатуры) на моем EditTextпрограммном обеспечении?

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

txtSearch.setFocusableInTouchMode(true);
txtSearch.setFocusable(true);
txtSearch.requestFocus();


Ответы:


353

Попробуй это:

EditText editText = (EditText) findViewById(R.id.myTextViewId);
editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);

http://developer.android.com/reference/android/view/View.html#requestFocus ()


Обновлен код, заставляющий клавиатуру показывать из этого ответа: stackoverflow.com/questions/5105354/…
— David Merriman

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

27
Это не работает. Этот работает для меня InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput (InputMethodManager.SHOW_FORCED, 0);
— Гюнай Гюльтекин

5
«Это не работает, брат». В некоторых случаях вам нужно вызывать этот код асинхронно из postDelayed (). У меня был случай, когда мне приходилось открывать клавиатуру после того, как пользователь нажал «ОК» в диалоговом окне. И когда диалог закрывался, он мешал фокусу. Итак, я назвал код выше из postDelayed (). Выполняется после закрытия диалога. Прибыль.
— Даниил Волох

2
237 голосов за ответ и 62 за "это не работает, брат" 🤔 Я проверил его, чтобы получить собственное мнение, и он отлично работает!)
— Даниил

165

использовать:

editText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);

20
Перепробовав более 5 других подходов, это был единственный подход, который работал на меня (из Viewподкласса)
— Уильям

13
Это предложение приводит к тому, что клавиатура фиксируется, даже когда поле теряет фокус.
— до

2
да, это работает и для меня, и imm.showSoftInput()не работает.
— Spark.Bao

8
Хотя этот метод работает, у него есть и обратная сторона, выход из приложения с помощью кнопки «домой» (аппаратная часть) выведет клавиатуру на экран. Вам придется нажать кнопку возврата (аппаратную часть), чтобы скрыть клавиатуру, презирающую ее бесполезность на домашнем экране.
— Эдриен Хорниз

Другие подходы не сработали для меня, этот сработал. Спасибо.
— Иман Акбари

53

Это сработало для меня, благодаря ungalcrys

Показать клавиатуру:

editText = (EditText)findViewById(R.id.myTextViewId);
editText.requestFocus();
InputMethodManager imm = (InputMethodManager)getSystemService(this.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.HIDE_IMPLICIT_ONLY);

Скрыть клавиатуру:

InputMethodManager imm = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);

2
Единственное полное решение. Спасибо.
— Корро

41

showSoftInput не работал на меня вообще.

Я решил, что мне нужно установить режим ввода: android:windowSoftInputMode="stateVisible"(здесь, в компоненте Activity в манифесте)

Надеюсь, это поможет!


5
Это только показало клавиатуру, когда деятельность была начата.
— Уильям

1
Круто :) Перепробовал кучу ответов, но только с этим я смог заставить его работать :) Огромное спасибо.
— Срикант

очень недооцененный ответ
— Avinash R

Идеальный ответ. Работает только с «editText.requestFocus ()». Спасибо.
— AVJ

37
final EditText tb = new EditText(this);
tb.requestFocus();
tb.postDelayed(new Runnable() {
    @Override
    public void run() {
        InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        inputMethodManager.showSoftInput(tb, InputMethodManager.SHOW_IMPLICIT);
    }
}, 1000);

1
Я должен был сделать это для того, чтобы он появился в onResume (). Без задержки ничего не случилось бы, используя каждое решение, описанное в этой теме.
— FranticRock

1
Вот оно Это был ответ, который я искал. Тем не менее, вам не нужна целая вторая задержка. Я пробовал всего 150 миллисекунд, и это тоже хорошо работало.
— Rubberduck

1
Спасибо! Это работает даже в течение 0 мс ( tb.post({ showKeyboard(tb) })). Обратите внимание, что нам нужно представление EditText ( tb), а не представление фрагмента.
— CoolMind

16

Вот как можно сделать расширение kotlin для отображения и скрытия программной клавиатуры:

fun View.showKeyboard() {
  this.requestFocus()
  val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
  inputMethodManager.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}

fun View.hideKeyboard() {
  val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
  inputMethodManager.hideSoftInputFromWindow(windowToken, 0)
}

Тогда вы можете просто сделать это:

editText.showKeyboard()
// OR
editText.hideKeyboard()

это лучшее решение по сравнению с отдыхом
— d-feverx

5

Я рекомендую использовать LifecycleObserver , который является частью Handling жизненного цикла с жизненным циклом-Aware компонентов в Android Jetpack .

Я хочу открыть и закрыть клавиатуру, когда появится фрагмент / действие. Во-первых, определите две функции расширения для EditText. Вы можете разместить их в любом месте вашего проекта:

fun EditText.showKeyboard() {
    requestFocus()
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
}

fun EditText.hideKeyboard() {
    val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    imm.hideSoftInputFromWindow(this.windowToken, 0)
}

Затем определите LifecycleObserver, который открывает и закрывает клавиатуру, когда действие / фрагмент достигает onResume()или onPause:

class EditTextKeyboardLifecycleObserver(private val editText: WeakReference<EditText>) :
    LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun openKeyboard() {
        editText.get()?.postDelayed({ editText.get()?.showKeyboard() }, 100)
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun closeKeyboard() {
        editText.get()?.hideKeyboard()
    }
}

Затем добавьте следующую строку в любой из ваших фрагментов / действий, вы можете использовать LifecycleObserver в любое время. Например, для фрагмента:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

    // inflate the Fragment layout

    lifecycle.addObserver(EditTextKeyboardLifecycleObserver(WeakReference(myEditText)))

    // do other stuff and return the view

}

4

Вот класс KeyboardHelper для скрытия и отображения клавиатуры

import android.content.Context;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;

/**
 * Created by khanhamza on 06-Mar-17.
 */

public class KeyboardHelper {
public static void hideSoftKeyboard(final Context context, final View view) {
    if (context == null) {
        return;
    }
    view.requestFocus();
    view.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
assert imm != null;
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
}, 1000);
}

public static void hideSoftKeyboard(final Context context, final EditText editText) {
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
assert imm != null;
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
}
}, 1000);
}


public static void openSoftKeyboard(final Context context, final EditText editText) {
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        @Override
        public void run() {
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
assert imm != null;
imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
}
}, 1000);
}
}

0

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

    etPassword.post(() -> {
        etPassword.requestFocus();
        InputMethodManager manager = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
        manager.showSoftInput(etPassword, InputMethodManager.SHOW_IMPLICIT);
    });

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

В манифесте:

    <activity
        android:name=".activities.LoginActivity"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="stateVisible"/>

В коде:

etPassword.requestFocus();

0

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

Кстати, мой текст редактирования также обернут в LinearLayout.

Я добавил небольшую задержку для запроса фокуса, и ниже код работал для меня: (Kotlin)

 et_search.postDelayed({
     editText.requestFocus()

     showKeyboard()
 },400) //only 400 is working fine, even 300 / 350, the cursor is not showing

showKeyboard ()

 val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
 imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0)

0
editTxt.setOnFocusChangeListener { v, hasFocus ->
            val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            if (hasFocus) {
                imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY)
            } else {
                imm.hideSoftInputFromWindow(v.windowToken, 0)
            }
        }

-1

Я не мог заставить ни один из этих ответов работать самостоятельно. Решением для меня было объединить их:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
editText.requestFocus();
imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);

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


Это определенно не очень хорошая практика. Возможно, транзакция Activity или Fragment вмешивалась с программной клавиатурой или флаги метода ввода были установлены неправильно, но в любом случае это решение не следует использовать.
— Марсель Бро
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.