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();
Houcine
źródło

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

David Merriman
źródło
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);
ungalcrys
źródło
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);
Danilo Raspa
źródło
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!

vincebodi
źródło
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);
Kunal Bhatia
źródło
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()
alvarlagerlof
źródło
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

}
Paul Spiesberger
źródło
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);
}

}

Hamza Khan
źródło
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();
Uwaga Hadi
źródło
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)
veeyikpong
źródło
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
źródło
-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.

mwu
źródło
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