Як я можу програмно встановити фокус (і відобразити клавіатуру) на моєму редакторі


180

У мене є макет, який містить такі представлення, як цей:

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

Як я можу встановити фокус (відобразити клавіатуру) на EditTextпрограмі?

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

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


Відповіді:


352

Спробуйте це:

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/…
Девід Мерріман

5
вона працює лише тоді, коли я запускаю свою діяльність нормально, але коли я запускаю свою діяльність на TabHost, вона не працює,
Houcine

27
Це не працює. Цей для мене працює InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); im.toggleSoftInput (InputMethodManager.SHOW_FORCED, 0);
Günay Gültekin

5
"Брат не працює". У деяких випадках вам потрібно викликати цей код асинхронно від postDelayed (). У мене був випадок, коли мені довелося відкрити клавіатуру після того, як користувач натиснув "OK" у діалоговому вікні. І коли діалог закривався, він змішувався з фокусом. Тому я назвав код вище від 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
Єдине повне рішення. Дякую.
korro

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-temperaturex

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.

Я додав невелику затримку, щоб запросити фокус і нижче код працював для мене: (Котлін)

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

Я не впевнений, чому це було потрібно для мене - згідно з документами, здається, що будь-який метод повинен був працювати самостійно.


Це, безумовно, не є хорошою практикою. Можливо, транзакція "Діяльність" або "Фрагмент" втручалася в м'яку клавіатуру, або прапорці методу введення встановлені не правильно, але в будь-якому випадку це рішення не слід використовувати.
Марсель Бро
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.