Как программно установить фокус (и отобразить клавиатуру) на моем 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);
ungalcrys
источник
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 в манифесте)

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

vincebodi
источник
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()
alvarlagerlof
источник
это лучшее решение по сравнению с отдыхом
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)
veeyikpong
источник
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)
            }
        }
Vasudev
источник
-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);

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

MWU
источник
Это определенно не очень хорошая практика. Возможно, транзакция Activity или Fragment вмешивалась с программной клавиатурой или флаги метода ввода были установлены неправильно, но в любом случае это решение не следует использовать.
Марсель Бро