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


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.