Jak mogę ustawić ostrość (i wyświetlić klawiaturę) na moim EditText programowo


180

Mam układ, który zawiera takie widoki:

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

Jak mogę ustawić ostrość (wyświetlić klawiaturę) na moim EditTextprogramowo?

Próbowałem tego i działa tylko wtedy, gdy uruchamiam Activitynormalnie, ale kiedy uruchamiam go w TabHost, to nie działa.

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


Odpowiedzi:


352

Spróbuj tego:

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


Zaktualizowano kod, aby wymusić wyświetlanie klawiatury na podstawie tej odpowiedzi: stackoverflow.com/questions/5105354/...
— David Merriman

5
działa tylko wtedy, gdy normalnie uruchamiam moją aktywność, ale kiedy uruchamiam moją aktywność na TabHost, to nie działa,
— Houcine

27
To nie działa. Ten działa dla mnie InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput (InputMethodManager.SHOW_FORCED, 0);
— Günay Gültekin

5
„To nie działa bracie”. W niektórych przypadkach musisz wywołać ten kod asynchronicznie z postDelayed (). Miałem przypadek, gdy musiałem otworzyć klawiaturę po tym, jak użytkownik nacisnął „OK” w oknie dialogowym. A kiedy okno dialogowe się zamykało, bałagan w centrum uwagi. Więc wywołałem powyższy kod z postDelayed (). Wykonało się po zamknięciu okna dialogowego. Zysk.
— Danylo Volokh,

2
237 głosów oddanych na odpowiedź i 62 na „to nie działa bracie” tested Przetestowałem ją, aby uzyskać własną opinię i działa idealnie!)
— Daniel

165

posługiwać się:

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

20
Po wypróbowaniu więcej niż 5 innych podejść, był to jedyny, który zadziałał dla mnie (z Viewpodklasy)
— William

13
Ta sugestia prowadzi do naprawienia klawiatury, nawet gdy pole traci skupienie.
— do

2
tak, to też działa dla mnie i imm.showSoftInput()nie działa.
— Spark.Bao

8
Chociaż ta metoda działa, ma wadę, zamknięcie aplikacji przyciskiem Home (sprzęt) pozwoli klawiaturze na ekranie. Będziesz musiał nacisnąć przycisk powrotu (sprzęt), aby ukryć klawiaturę gardzącą jej bezużytecznością na ekranie głównym.
— Adrien Horgnies

Inne metody nie działały dla mnie, ta działała. Dziękuję Ci.
— Iman Akbari

53

To zadziałało dla mnie, dzięki ungalcrys

Pokaż klawiaturę:

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

Ukryj klawiaturę:

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

2
Jedyne pełne rozwiązanie. Dzięki.
— korro

41

showSoftInput w ogóle mi nie działał.

Pomyślałem, że muszę ustawić tryb wprowadzania: android:windowSoftInputMode="stateVisible"(tutaj w komponencie Aktywność w manifeście)

Mam nadzieję, że to pomoże!


5
To po prostu pokazało klawiaturę, gdy aktywność została rozpoczęta.
— William

1
Wspaniale :) Próbowałem wiele odpowiedzi, ale tylko dzięki temu mogłem sprawić, że zadziała :) Dziękuję bardzo.
— Srikanth

bardzo niedoceniana odpowiedź
— Avinash R

Idealna odpowiedź. Działa tylko z „editText.requestFocus ()”. Dzięki.
— 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
Musiałem to zrobić, aby pokazać to w onResume (). Bez opóźnienia nic by się nie stało przy użyciu każdego rozwiązania opisanego w tym wątku.
— FranticRock,

1
Tu jest. To była odpowiedź, której szukałem. Chociaż niekoniecznie potrzebujesz całego drugiego opóźnienia. Próbowałem tylko 150 milisów, i to też działało dobrze.
— Rubberduck 17.07.17

1
Dzięki! Działa to nawet przez 0 ms ( tb.post({ showKeyboard(tb) })). Zauważ, że potrzebujemy widoku EditText ( tb), a nie widoku fragmentu.
— CoolMind

16

Oto, w jaki sposób można wykonać rozszerzenie Kotlin do wyświetlania i ukrywania miękkiej klawiatury:

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

Następnie możesz po prostu to zrobić:

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

jest to lepsze rozwiązanie niż reszta
— d-feverx

5

Polecam korzystanie z LifecycleObserver, który jest częścią obsługi Lifecycle with Lifecycle-Aware Components systemu Android Jetpack .

Chcę otworzyć i zamknąć klawiaturę, gdy pojawi się fragment / działanie. Po pierwsze, zdefiniuj dwie funkcje rozszerzenia dla EditText. Możesz umieścić je w dowolnym miejscu w swoim projekcie:

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

Następnie zdefiniuj LifecycleObserver, który otwiera i zamyka klawiaturę, gdy działanie / fragment osiągnie onResume()lub 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()
    }
}

Następnie dodaj następujący wiersz do dowolnego fragmentu / działania, możesz ponownie użyć LifecycleObserver w dowolnym momencie. Np. Dla fragmentu:

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

}

3

Oto klasa KeyboardHelper do ukrywania i pokazywania klawiatury

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(Context context, 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);
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }, 1000);
}

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


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

}


0

Pierwszy sposób :

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

Drugi sposób :

W Manifeście:

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

W kodzie:

etPassword.requestFocus();

0

Próbowałem wiele sposobów i to nie działa, nie jestem pewien, ponieważ używam wspólnego przejścia z fragmentu do działania zawierającego tekst edycji.

Przy okazji mój tekst edycyjny jest również zawinięty w LinearLayout.

Dodałem niewielkie opóźnienie, aby poprosić o fokus i poniższy kod działał dla mnie: (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

Nie mogłem zmusić żadnej z tych odpowiedzi do samodzielnego działania. Rozwiązaniem było dla mnie połączenie:

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

Nie jestem pewien, dlaczego było to dla mnie wymagane - według dokumentów wydaje się, że każda metoda powinna działać sama.


To zdecydowanie nie jest dobra praktyka. Być może transakcja działania lub fragmentu ingerowała w klawiaturę programową lub flagi metody wprowadzania nie były ustawione poprawnie, ale w żadnym wypadku nie należy stosować tego rozwiązania.
— Marcel Bro
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.