Jak pokazać klawiaturę programową, gdy edittext jest zogniskowany


461

Chcę automatycznie wyświetlać klawiaturę programową, gdy EditTextjest ustawiona ostrość (jeśli urządzenie nie ma fizycznej klawiatury) i mam dwa problemy:

  1. Kiedy moje Activityjest wyświetlane, moje EditTextjest skupione, ale klawiatura nie jest wyświetlana, muszę ponownie kliknąć na nią, aby wyświetlić klawiaturę (powinna być wyświetlana, gdy moje Activityjest wyświetlane).

  2. A kiedy klikam przycisk Gotowe na klawiaturze, klawiatura jest dyskredytowana, ale EditTextpozostaje skupiona i ty nie chcesz (ponieważ moja edycja jest zakończona).

Aby wznowić, moim problemem jest posiadanie czegoś bardziej podobnego do iPhone'a: ​​które utrzymują synchronizację klawiatury z moim EditTextstanem (skoncentrowany / nieokreślony) i oczywiście nie przedstawia miękkiej klawiatury, jeśli jest fizyczna.


Mam tylko podstawowy EditText, taki jak: <EditText android: id = "@ + id / myEditText" android: layout_width = "fill_parent" android: layout_height = "wrap_content" android: imeOptions = "actionDone" /> A na mojej działalności mam this: EditText editTxt = (EditText) findViewById (R.id.myEditText); editTxt.requestFocus ();
Ludovic Landry

2
Pomogło mi to lepiej niż jakakolwiek odpowiedź w tym poście: stackoverflow.com/a/2418314/1491212
Armel Larcier

Odpowiedzi:


628

Aby wymusić pojawienie się miękkiej klawiatury, możesz użyć

EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
yourEditText.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);

Aby usunąć fokus EditText, niestety trzeba mieć manekina, Viewaby się skupić.

mam nadzieję, że to pomoże


Aby go zamknąć, możesz użyć

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

Działa to przy użyciu go w oknie dialogowym

public void showKeyboard(){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

public void closeKeyboard(){
    InputMethodManager inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
    inputMethodManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
}

2
Jeśli to zrobię, klawiatura programowa jest wyświetlana, gdy pojawia się aktywność (jest dobra), ale kiedy skupiam się na opuszczeniu EditText i przechodzę na przykład do przycisku, klawiatura pozostaje (to źle).
Ludovic Landry

157
Nie działa dla mnie z EditText w oknie dialogowym, które jest już aktywne. Nie pewny dlaczego.
Matthias

10
@AbdellahBenhammou, być może wykonanie żądania wywołania fokusu na tekście edycji przed pokazaniem, że miękkie wprowadzenie może rozwiązać problem. To mi zrobiło.
r1k0

18
@AbdellahBenhammou, zrób to w oknie dialogowym onCreate (): getDialog (). GetWindow (). SetSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
Phillip,

22
Działa tylko w połączeniu z yourEditText.requestFocus()opisanym tutaj: stackoverflow.com/questions/8991522/...
Vivek Pandey,

231

Miałem ten sam problem. Natychmiast po zmianie tekstu WIDOCZNOŚĆ edit z GONE na VISIBLE musiałem ustawić fokus i wyświetlić miękką klawiaturę. Osiągnąłem to za pomocą następującego kodu:

new Handler().postDelayed(new Runnable() {

    public void run() {
//        ((EditText) findViewById(R.id.et_find)).requestFocus();
//              
        EditText yourEditText= (EditText) findViewById(R.id.et_find);
//        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
//        imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT);

        yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
        yourEditText.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));                           
    }
}, 200);

Działa dla mnie z opóźnieniem 100 ms, ale zakończyło się niepowodzeniem bez opóźnienia lub z opóźnieniem 1 ms.

Skomentowana część kodu pokazuje inne podejście, które działa tylko na niektórych urządzeniach. Testowałem na wersjach systemu operacyjnego 2.2 (emulator), 2.2.1 (prawdziwe urządzenie) i 1.6 (emulator).

Takie podejście zaoszczędziło mi dużo bólu.


48
Nie wiedziałem, że coś może być tak brzydkie i jednocześnie piękne. Dziękuję bardzo!
mkerley

15
@jellyfish to symuluje stuknięcie w EditText. W przypadku innych osób, które to czytają, zamiast tworzyć nowe Handler, można również użyć View.postDelayed()metody na samym yourEditTextwidżecie.
Tony Chan,

5
To jest hack - znacznie lepsze rozwiązanie Davida Chandlera.
Ben Bederson

4
Jeśli rozwiązanie Davida Chandlera działa na wszystkich wersjach / urządzeniach z Androidem oraz w przypadku, gdy zmieniono WIDOCZNOŚĆ z GONE na WIDOCZNIE, to TAK - zamiast tego należy użyć jego rozwiązania.
Mike Keskinov

3
Zgoda. Czy znasz lepsze rozwiązanie, które działa we wszystkich wersjach Androida?
Mike Keskinov

162

Aby spowodować pojawienie się klawiatury, użyj

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

Ta metoda jest bardziej niezawodna niż bezpośrednie wywoływanie InputMethodManager.

Aby go zamknąć, użyj

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

12
Czy ktoś może wyjaśnić, dlaczego jest to bardziej wiarygodne niż bezpośrednie wywoływanie InputMethodManager? (Po pierwsze, to nie działa, w przeciwieństwie do rozwiązania Raukodrauga.)
Matthew Quiros

5
Dla mnie też nie działa. Praca w systemie Android 2.3.5. Rozwiązanie raukodraug działa dla mnie. Szukano zależności wersji, ale nie można jej znaleźć.
Hugo Logmans

2
To działało dla mnie w Androidzie 4.4.2. Metoda InputMethodManager wybrana jako rozwiązanie dla tego postu nie działała dla mnie.
Phil

po użyciu metody w odpowiedzi dołączyłem to i zadziałało, ale bez tego nie działało. thanx
Manny265,

2
Nie działało dla mnie w Androidzie 4.4.2. Pokazuje klawiaturę, ale jej nie ukrywa.
John J Smith

87

Gdy nic innego nie działa, zmuś to do pokazania :

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

A później, jeśli chcesz go zamknąć, na przykład w onPause (), możesz wywołać:

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

4
Miałeś rację, @Bolling! Gdy nic więcej nie działało, twój kod mnie uratował. Dzięki!
Willian Paixao,

3
Twój kod był jedynym, który dla mnie pracował, a ja wypróbowałem wszystkie rozwiązania na tej stronie! Wielkie dzięki!
Mattia Ruggiero,

4
nie zmuszaj tego. w niektórych przypadkach, gdy przechodzisz z pierwszego planu do tła, klawiatura pozostanie tam, ponieważ wymusiłeś to. jest to problem fragmentacji, ale widziałem to na duetach Samsung.
j2emanue,

Zwykle zawsze mam kod do zamykania klawiatury onPause (), ponieważ widziałem, jak się zacina, nawet jeśli nie wymusiłeś jej.
Bolling

To zadziałało, ale po przejściu na inne ekrany wciąż pozostaje otwarte
Sithu

75

Poniższy kod pochodzi ze kodu źródłowego Google 4.1 dla SearchView. Wygląda na to, że działa dobrze również na mniejszych wersjach Androida.

private Runnable mShowImeRunnable = new Runnable() {
    public void run() {
        InputMethodManager imm = (InputMethodManager) getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);

        if (imm != null) {
            imm.showSoftInput(editText, 0);
        }
    }
};

private void setImeVisibility(final boolean visible) {
    if (visible) {
        post(mShowImeRunnable);
    } else {
        removeCallbacks(mShowImeRunnable);
        InputMethodManager imm = (InputMethodManager) getContext()
                .getSystemService(Context.INPUT_METHOD_SERVICE);

        if (imm != null) {
            imm.hideSoftInputFromWindow(getWindowToken(), 0);
        }
    }
}

Następnie należy dodać następujący kod podczas tworzenia kontroli / działania. (W moim przypadku jest to kontrola złożona, a nie działanie).

this.editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    public void onFocusChange(View v, boolean hasFocus) {
        setImeVisibility(hasFocus);
    }
});

Dzięki! Działa niesamowicie dobrze. I jest to rozwiązanie, z którym czuję się swobodniej na podstawie wszystkich odpowiedzi i tematów, które czytałem na ten temat.
Rui

37
:-D setImeVisibility(hasFocus)?
Matthias

Wypróbowałem tę metodę, ponieważ faktycznie „kręciłem własnym widokiem wyszukiwania” (nie chciałem tego robić, ale były powody). To działało dla mnie, z wyjątkiem momentu rozpoczęcia działalności. Dodałem androida: windowSoftInputMode = "alwaysVisible" do działania i już wywołałem requestFocus () w tekście edycji. Działa jak mistrz.
javahead76

Masz pomysł na removeCallbacks (mShowImeRunnable)? Myślałem, że gdy wybierzesz opcję uruchomienia z kolejki, zostanie ona również usunięta z kolejki w tym samym czasie?
Cheok Yan Cheng

1
Po wypróbowaniu kilku odmian był to jedyny, który działał dla mnie konsekwentnie (Android 4.42). Dzięki
John J Smith

34

android:windowSoftInputMode="stateAlwaysVisible" -> w pliku manifestu.

edittext.requestFocus(); -> w kodzie.

Otworzy się miękka klawiatura, na której tekst edycyjny skupi się na żądaniu, gdy pojawi się aktywność.


2
Spowoduje to otwarcie klawiatury podczas tworzenia działania.
xpto

nie odpowiada na pytanie, ale pomógł mi :)
S.Thiongane

otwiera klucz bez requestfocus w API 22
David

Działa dobrze w moim przypadku. Zastanawiam się, dlaczego atrybut skupienia żądania tylko z xml również potrzebuje wzmianki manifest!
sud007

30

Miałem trochę szczęścia w prostych przypadkach z poniższym kodem. Nie ukończyłem wszystkich testów, ale ...

EditText input = (EditText) findViewById(R.id.Input);
input.requestFocus();    
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
input.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));

I pojawia się presto klawiatura.


W moim przypadku miałem przycisk, aby dodać opcjonalne informacje. W module obsługi button.onClick dodano powyższy kod, aby wymusić pojawienie się klawiatury programowej w celu wprowadzenia opcjonalnych informacji. Droid 2.2.2
Dent

jest to dobre rozwiązanie, ale nie zapominaj, że powinieneś utworzyć na nich obiekt MotionEvent i wywołać na nich recycle () po użyciu, aby ponownie użyć go później.
jimbob

Potrzebujesz tylko jednej metody dispatchTouchEvent () z argumentem ACTION_UP ..
Mohammed Junaid

15

Możesz spróbować wymusić pojawienie się miękkiej klawiatury, to działa dla mnie:

...
dialog.show();
input.requestFocus();
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

1
To działa dla mnie ... Próbowałem tych InputMethodManager imm = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); imm.showSoftInput (nazwa, inputMethodManager.SHOW_IMPLICIT); lub getWindow (). setSoftInputMode (WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE); ale żaden z nich nie działał.
Günay Gültekin

10

Czasami odpowiedź raukodrauga nie działa. Zrobiłem to w ten sposób z kilkoma próbami i błędami:

public static void showKeyboard(Activity activity) {
    if (activity != null) {
        activity.getWindow()
                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
    }
}

public static void hideKeyboard(Activity activity) {
    if (activity != null) {
        activity.getWindow()
                .setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    }
}

I część EditText :

    editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if (!hasFocus) {
                hideKeyboard(getActivity());
            } else {
                showKeyboard(getActivity());
            }
        }
    });

1
To jedyne rozwiązanie, które działało dla mnie na Androidzie 5
1021430

10

Aby ukryć klawiaturę, użyj tej:

getActivity().getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

i aby wyświetlić klawiaturę:

getActivity().getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

W przypadku DialogFragment możesz wywołać to w przesłoniętej opcji onStart()i możesz użyć jej getDialog().getWindow()jako alternatywy dla getActivity().getWindow().
Mr-IDE,

10

A dla Kotlin wystarczy użyć tych rozszerzeń:

fun EditText.showKeyboard() {
    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)
}

właśnie tego szukałem.
lasec0203

8

W przypadku fragmentu upewnij się, że działa:

 displayName = (EditText) view.findViewById(R.id.displayName);
    InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

7

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

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

android:windowSoftInputMode="stateVisible" 

6

Wierz lub nie, mój problem z klawiaturą został rozwiązany, gdy odkryłem, że animacje działań mogą wyłączyć klawiaturę. Kiedy wywołasz zamiar za pomocą

i.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);

i

overridePendingTransition(0, 0);

Może ukryć miękką klawiaturę i nie ma sposobu, aby to pokazać.


6

Miałem ten sam problem w różnych różnych sytuacjach, a rozwiązania, które znalazłem, działają w niektórych, ale nie działają w innych, więc oto rozwiązanie łączące, które działa w większości znalezionych sytuacji:

public static void showVirtualKeyboard(Context context, final View view) {
    if (context != null) {
        final InputMethodManager imm =  (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        view.clearFocus();

        if(view.isShown()) {
            imm.showSoftInput(view, 0);
            view.requestFocus();
        } else {
            view.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() {
                @Override
                public void onViewAttachedToWindow(View v) {
                    view.post(new Runnable() {
                        @Override
                        public void run() {
                            view.requestFocus();
                            imm.showSoftInput(view, 0);
                        }
                    });

                    view.removeOnAttachStateChangeListener(this);
                }

                @Override
                public void onViewDetachedFromWindow(View v) {
                    view.removeOnAttachStateChangeListener(this);
                }
            });
        }
    }
}

6
editText.post(new Runnable() {
    @Override
    public void run() {
        InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
});

6

Połączyłem wszystko tutaj i dla mnie to działa:

public static void showKeyboardWithFocus(View v, Activity a) {
    try {
        v.requestFocus();
        InputMethodManager imm = (InputMethodManager) a.getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);
        a.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

6

To zadziałało dla mnie. Możesz spróbować z tym również, aby wyświetlić klawiaturę:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

5

fragment kodu. . .

public void hideKeyboard(Context activityContext){

    InputMethodManager imm = (InputMethodManager)
            activityContext.getSystemService(Context.INPUT_METHOD_SERVICE);

    //android.R.id.content ( http://stackoverflow.com/a/12887919/2077479 )
    View rootView = ((Activity) activityContext)
            .findViewById(android.R.id.content).getRootView();

    imm.hideSoftInputFromWindow(rootView.getWindowToken(), 0);
}

public void showKeyboard(Context activityContext, final EditText editText){

    final InputMethodManager imm = (InputMethodManager)
            activityContext.getSystemService(Context.INPUT_METHOD_SERVICE);

    if (!editText.hasFocus()) {
        editText.requestFocus();
    }

    editText.post(new Runnable() {
        @Override
        public void run() {
            imm.showSoftInput(editText, InputMethodManager.SHOW_FORCED);
        }
    });
}

5

Kotlin rozszerzenie do pokazywania ostrości na klawiaturze.

Jest to kombinacja poprzednich odpowiedzi, które były zbyt długie lub niepełne.

To rozszerzenie publikuje uruchamialną kolejkę komunikatów, która pokazuje klawiaturę programową po zażądaniu fokusa:

fun View.showSoftKeyboard() {
    post {
        if (this.requestFocus()) {
            val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
            imm?.showSoftInput(this, InputMethodManager.SHOW_IMPLICIT)
        }
    }
}

W razie potrzeby można to nazwać z dowolnego widoku:

editText.showSoftKeyboard()


4
final InputMethodManager keyboard = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
keyboard.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

4

Wewnątrz manifestu:

android:windowSoftInputMode="stateAlwaysVisible"- początkowo uruchomiona klawiatura. android:windowSoftInputMode="stateAlwaysHidden" - początkowo ukryta klawiatura.

Lubię używać także "adjustPan"dlatego, że kiedy klawiatura się uruchamia, ekran automatycznie się dostosowuje.

 <activity
      android:name="YourActivity"
      android:windowSoftInputMode="stateAlwaysHidden|adjustPan"/>

4

Po prostu dodaj tę linię w widoku EditText:

android:isScrollContainer="true"

i TADA - klawiatura zaczęła pojawiać się automatycznie!

Miałem podobny problem i odkryłem to proste i dziwne rozwiązanie.

Jak już wspomniano tutaj przez użytkownika 3392439, wygląd klawiatury po fokusie jest niejasno związany z obecnością komponentu przewijania w pliku XML.

Nawet obecność innego widoku EditText, który zawiera wyżej wymienioną linię w tym samym pliku XML, sprawia, że ​​klawiatura pojawia się bez względu na to, który z nich jest aktualnie skoncentrowany.

Jeśli masz przynajmniej jeden widoczny widok zawierający składnik przewijania w pliku XML - klawiatura pojawi się automatycznie na fokusie.

Jeśli nie ma przewijania - musisz kliknąć przycisk Edytuj tekst, aby wyświetlić klawiaturę.


Jest to bardzo dziwne, ale na pewno działa - próbowałem to zrobić requesFocus()z poziomu programu do obsługi kliknięć i jest to jedyny sposób inny niż jawny showSoftInput SHOW_FORCED
narysowany

Cholera jasna, dzięki człowieku. Nie mam pojęcia, dlaczego to działa, ale przetestowałem go na 8 urządzeniach różnych producentów i działało za każdym razem!
Antonio Vlasic,

3

Wszystkie rozwiązania podane powyżej ( InputMethodManager interakcji w OnFocusChangeListener.onFocusChange słuchacza dołączony do EditText działa dobrze, jeśli masz Single Edit w działalności.

W moim przypadku mam dwie zmiany.

 private EditText tvX, tvY;
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
 tvX.setOnFocusChangeListener(this);
    tvY.setOnFocusChangeListener(this);

@Override
public void onFocusChange(View v, boolean hasFocus) {       
    InputMethodManager imm =  (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if(tvX.hasFocus() || tvY.hasFocus()) {            
        imm.showSoftInput(v, 0);            
    } else {
        imm.hideSoftInputFromWindow(v.getWindowToken(), 0);         
    }       
};

Zauważyłem, że onFocusChange jest uruchamiany dla tvX z hasFocus = true (pokazana klawiatura), ale potem dla tvY z hasFocus = true (klawiatura ukryta). Ostatecznie klawiatura nie była widoczna.

Ogólne rozwiązanie powinno mieć poprawną instrukcję, jeśli „pokaż klawiaturę, jeśli tekst edytora tekstu jest aktywny”


3

W sekcji onResume () działania można wywołać metodę bringKeyboard ();

 onResume() {
     EditText yourEditText= (EditText) findViewById(R.id.yourEditText);
     bringKeyboard(yourEditText);
 }


  protected boolean bringKeyboard(EditText view) {
    if (view == null) {
        return false;
    }
    try {
      // Depending if edittext has some pre-filled values you can decide whether to bring up soft keyboard or not
        String value = view.getText().toString();
        if (value == null) {
            InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
            return true;
        }
    } catch (Exception e) {
        Log.e(TAG, "decideFocus. Exception", e);
    }
    return false;
  }

Co to jest WidgetUtils.showKeyboard? To najważniejszy element tutaj.
TWiStErRob

2

Żadna z odpowiedzi nie działała dla mnie. Oto prosty sposób.

searchEditText.setVisibility(View.VISIBLE);
                final Handler handler=new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        searchEditText.requestFocus();
                    }
                }, 400);

Właśnie opóźniłem metodę requestFocus () o 400 ms.


Wielkie dzięki, potrzebuje trochę opóźnienia, aby klawiatura pokazała ...
hkh114

1

Odkryłem dziwne zachowanie, ponieważ w jednej z moich aplikacji klawiatura programowa automatycznie wyświetlała się po wejściu do działania (w funkcji onCreate znajduje się editText.requestFocus ().

Podczas dalszego kopania odkryłem, że dzieje się tak, ponieważ wokół układu znajduje się ScrollView. Po usunięciu ScrollView zachowanie jest takie, jak opisano w pierwotnym zgłoszeniu problemu: tylko po kliknięciu już zaznaczonego tekstu editText pojawia się klawiatura programowa.

Jeśli to nie działa, spróbuj zainstalować ScrollView - i tak jest nieszkodliwy.


1

Miałem podobny problem z animacjami widoku . Dlatego umieściłem detektor animacji, aby upewnić się, że zaczekam na zakończenie animacji, zanim spróbuję poprosić o dostęp z klawiatury do pokazanego tekstu edycji.

    bottomUp.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {
        }

        @Override
        public void onAnimationEnd(Animation animation) {
            if (textToFocus != null) {
                // Position cursor at the end of the text
                textToFocus.setSelection(textToFocus.getText().length());
                // Show keyboard
                InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                imm.showSoftInput(textToFocus, InputMethodManager.SHOW_IMPLICIT);
            }
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
        }
    });

1

Zgadzam się z Raukodraugiem, dlatego używam w swithview, aby poprosić / wyczyścić fokus w następujący sposób:

    final ViewSwitcher viewSwitcher = (ViewSwitcher) findViewById(R.id.viewSwitcher);
    final View btn = viewSwitcher.findViewById(R.id.address_btn);
    final View title = viewSwitcher.findViewById(R.id.address_value);

    title.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            viewSwitcher.showPrevious();
            btn.requestFocus();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.showSoftInput(btn, InputMethodManager.SHOW_IMPLICIT);
        }
    });

    // EditText affiche le titre evenement click
    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            btn.clearFocus();
            viewSwitcher.showNext();
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(btn.getWindowToken(), 0);
            // Enregistre l'adresse.
            addAddress(view);
        }
    });

Pozdrowienia.

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.