podczas używania AlertDialog.Builder z EditText, klawiatura programowa nie wyskakuje


117

Używam AlertDialog.Builder w celu utworzenia pola wprowadzania, z EditText jako metodą wprowadzania.

Niestety, miękka klawiatura nie wyskakuje, mimo że tekst edycji jest aktywny , chyba że ponownie go wyraźnie dotkniesz.

Czy jest sposób, aby zmusić go do popu?

Wypróbowałem następujące, po (AlertDialog.Builder) .show (); ale bezskutecznie.

InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(input, InputMethodManager.SHOW_FORCED);

Czy ktoś może pomóc?

Dzięki!!


1
proszę sformatuj swój kod źródłowy.
philipp

W takim razie ja również was zagłosuję :) Miałem ten sam problem z wyszukiwaniem przez wiele godzin i ostatnia odpowiedź od grine4ka działa świetnie
philipp

Odpowiedzi:


222

Zrobiłem coś takiego

AlertDialog.Builder b = new AlertDialog.Builder(this);//....
AlertDialog dialog = b.create();

dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

dialog.show();

3
Dziękuję bardzo. Szukałem przez chwilę i to jest droga, którą chcesz iść. Wszystkie OnFocusChangeListenerpodejścia wydają mi się zbyt trudne i powodują kłopoty. Musisz stworzyć AlertDialogz AlertDialog.Builder!
philipp

Czy to naprawdę jest rozwiązanie? To po prostu zmusza klawiaturę do wyświetlenia, niezależnie od tego, czy istnieje pole wejściowe, czy nie, bez względu na to, czy pole wejściowe jest aktywne, czy nie, prawda? =)
Ted,

@Ted, masz rację, to nie jest prawdziwe rozwiązanie, ale działa. Próbowałem zrobić coś takiego, jeśli w oknie dialogowym nie ma edycji, a klawiatura programowa się nie pojawiła.
grine4ka

1
Właściwie udaje mi się to „rozwiązać” (obejście). Używam setOnFocusChangeListener dla EditText iw onFocusChange, jeśli sprawdzam, czy ma fokus (zmienna "hasFocus"), a jeśli tak, robię getWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
Ted

1
Uwaga: aby to zadziałało, musisz umieścić setSoftInputModelinię wcześniej dialog.show() lub nie zadziała. +1 za proste, poprawne rozwiązanie przy okazji
Spikatrix

29

Udało mi się to rozwiązać w ten sposób:

Dialog = builder.create();
Dialog.show();
Dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE  | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
Dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

23

Dowiedziałem się, że ten sam kod działa poprawnie na tablecie, klawiatura wyskakuje, ale na telefonie tak nie jest, więc dalsze badania wydają się wskazywać na opcję „dostosuj”.

Używam tego, jest znacznie czystszy.

AlertDialog d = builder.create();
d.getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
d.show();

Dzięki. To musi być lepsze niż używanie SOFT_INPUT_STATE_ALWAYS_VISIBLE. Jak SOFT_INPUT_STATE_ALWAYS_VISIBLEbędzie blokować elementy interfejsu użytkownika okna dialogowego, gdzie SOFT_INPUT_ADJUST_RESIZEmożna zmienić rozmiar i „podnieść” okno dialogowe.
Cheok Yan Cheng

10

W moim przypadku jedyny sposób, w jaki mogłem wyświetlić klawiaturę, gdy okno dialogowe było wyświetlane, to dodanie do DialogFragment:

@Override
public void onResume() {
    super.onResume();
    getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    myEditText.requestFocus();
}

Zwróć uwagę na SOFT_INPUT_STATE_ALWAYS_VISIBLE zamiast SOFT_INPUT_STATE_VISIBLE .

Z dokumentacji:

int SOFT_INPUT_STATE_ALWAYS_VISIBLE
Visibility state for softInputMode: please always make the soft input area visible when this window receives input focus.

To było jedyne rozwiązanie, które działało dla mnie i wypróbowałem ich OBCIĄŻENIE. Mój był plikiem dialogfragment buildera alertdialog. Wydawało się, że ważnym elementem było umieszczenie powyższego kodu w onResume (). Nigdzie indziej po prostu nie działało!
user960914

6

Kiedy wywołujesz showDialog, aby wyświetlić dialog utworzony za pomocą AlertDialog w onCreateDialog

Powinieneś umieścić kod tutaj

    @Override
protected void onPrepareDialog (int id, Dialog dialog, Bundle args)
{
    TextView editText=(TextView) dialog.findViewById(R....);

    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
       @Override
       public void onFocusChange(View v, boolean hasFocus) {
         if (hasFocus) {
            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
         }
       }
    });

}

5

Podano tutaj znacznie lepsze rozwiązanie .

dialog.getWindow().clearFlags(
         WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
        |WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);

Brak obejścia. EditTextzachowuje się zgodnie z oczekiwaniami.


Ten działał dla mnie, drugie rozwiązanie wprowadzało fokus, ale klawiatura nie była wyświetlana.
Akshay

2
Window window = dialog.getWindow();
    window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

1

Tu już udzielono odpowiedzi . U mnie zadziałało używanie OnFocusChangeListener.


Pytanie dotyczy tego, jak ustawić miękki tryb wprowadzania dla obiektu AlertDialog.Builder, jednak wątek, do którego się odwołujesz, zawiera przykład użycia obiektu AlertDialog. Jeśli spróbuję użyć sugerowanego kodu (za pomocą alert.getWindow (). SetSoftInputMode (...) w ramach OnFocusChangeListener) Eclipse, że metoda getWindow () nie jest zdefiniowana dla typu AlertDialog.Builder. Czy możesz mi pomóc to naprawić?
prepbgg

1

W moim przypadku SoftInputMode nie był wyświetlany, gdy ustawiłem go przed wyświetleniem okna dialogowego (po jego utworzeniu). Poniższy kod zadziałał dla mnie, gdzie ustawiam SoftInputMode po wyświetleniu okna dialogowego.

Kotlin:

val dialog = MaterialAlertDialogBuilder(context) // Other builder code
                .create()
dialog.show()
dialog.window?.apply { // After the window is created, get the SoftInputMode
    clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)
    clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)
    setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE)
}

Jawa:

AlertDialog dialog = MaterialAlertDialogBuilder(getContext()) // Other builder code
                .create();
dialog.show();
Window window = dialog.getWindow();
if(window != null){ // After the window is created, get the SoftInputMode
    window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
    window.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}

Mam nadzieję, że pomoże to każdemu, kto miał ten sam problem co ja.


0

Spróbuj tego, to działa dla mnie

Jeśli chcesz wyświetlić klawiaturę ekranową:

InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.showSoftInput(input.getWindowToken(), 0);

A jeśli chcesz to ukryć:

  InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(input.getWindowToken(), 0);

0
final AlertDialog.Builder alert = new AlertDialog.Builder(context);

final AlertDialog dialog = alert.show();
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);

1
Lepiej jest zawrzeć kontekst / wyjaśnienie w kodzie, ponieważ dzięki temu odpowiedź będzie bardziej użyteczna dla PO i przyszłych czytelników.
EJoshuaS - Przywróć Monikę

0

Ten problem występuje, gdy EditText jest dodawany po wywołaniu AlertDialog.onCreate.

https://developer.android.com/reference/androidx/appcompat/app/AlertDialog.Builder

Klasa AlertDialog dba o automatyczne ustawienie android.view.WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM za Ciebie na podstawie tego, czy jakiekolwiek widoki w oknie dialogowym zwracają wartość true z View.onCheckIsTextEditor ().

Musisz wyczyścić flagę FLAG_ALT_FOCUSABLE_IM.

getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); 

Ponieważ AlertDialog.show jest wywoływana w DialogFragment.onStart, można wstawić kod w DialogFragment.onStart.

@Override
public void onStart() {
    super.onStart();
    getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
}

Lub możesz użyć Dialog.setOnShowListener, jeśli nie używasz DialogFragment.

dialog.setOnShowListener(new DialogInterface.OnShowListener() {
    @Override
    public void onShow(DialogInterface dialog) {
        getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    }
});
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.