2011-11-10 14 views
55

Moim zdaniem, mam wyszukiwanie EditText i chciałbym programowo aktywować zachowanie zdarzenia kliknięcia na polu, tj. Ustawić ostrość na polu tekstowym I wyświetlić miękką klawiaturę, jeśli konieczne (jeśli nie ma dostępnej twardej klawiatury).Android TextField: ustawianie ostrości + miękkiego wprowadzania programowo

Próbowałem field.requestFocus(). Pole rzeczywiście się skupia, ale miękka klawiatura nie jest wyświetlana.

Próbowałem field.performClick(). Ale to wywołuje tylko OnClickListener pola.

Każdy pomysł?

Odpowiedz

118

Dobry panie, spróbuj tego:

edittext.setFocusableInTouchMode(true); 
edittext.requestFocus(); 

Nie jestem pewien, ale to może być wymagane w niektórych telefonach (niektóre ze starszych urządzeń):

final InputMethodManager inputMethodManager = (InputMethodManager) context 
       .getSystemService(Context.INPUT_METHOD_SERVICE); 
inputMethodManager.showSoftInput(edittext, InputMethodManager.SHOW_IMPLICIT); 
+2

sam wynik jak requestFocus (...) sam Pole dostaje ostrość, ale klawiatura nie jest wyzwalane. – fiddler

+8

W końcu rozwiązałem wydane przez wywołanie 'field.requestFocus()' w metodzie 'onResume()' działania (zamiast 'onCreate()'). Nie wiem dokładnie, dlaczego to działa ... – fiddler

+25

Widok nie może skupić się, zanim zostanie wyświetlony na ekranie. Nie można tego zrobić, gdy onCreate() przechowuje wątek UI, dlatego widok jest ułożony bezpośrednio po onCreate() i przed onResume(). :) – pgsandstrom

43

Oto kod, który pracował dla mnie.

edittext.post(new Runnable() { 
    public void run() { 
     edittext.requestFocusFromTouch(); 
     InputMethodManager lManager = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
     lManager.showSoftInput(edittext, 0); 
    } 
}); 

To wszystko! Enjoy;)

+0

Dzięki i ten pracował dla mnie. Dodaję "EditText" programowo po naciśnięciu przycisku użytkownika. – dumbfingers

+0

Dodałem 'EditText' z modalnego okna dialogowego. Niektóre flagi są ustawiane przez Androida, dzięki czemu ta kontrolka nie otrzymuje żadnych dotknięć. Jeśli dodasz pole do działania, flagi nie zostaną ustawione. – JeffRegan

+0

Wygląda na to, że 'InputType' w' EditText' jest ustawione na wartość null przez system Android. Jeśli ustawisz 'InputType', to powinno działać. – JeffRegan

4

następujący kodpracował dla mnie, po dwóch innych odpowiedzinie działa dla mnie:

@Override 
public void onResume() { 
    super.onResume(); 
    SingletonBus.INSTANCE.getBus().register(this); 
    //passwordInput.requestFocus(); <-- that doesn't work 
    passwordInput.postDelayed(new ShowKeyboard(), 300); //250 sometimes doesn't run if returning from LockScreen 
} 

Gdzie ShowKeyboard jest

private class ShowKeyboard implements Runnable { 
    @Override 
    public void run() { 
     passwordInput.setFocusableInTouchMode(true); 
    //  passwordInput.requestFocusFromTouch(); 
     passwordInput.requestFocus();    
     getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); 
     ((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)).showSoftInput(passwordInput, 0); 
    } 
} 

Po udanym wprowadzeniu, upewniam się również, że ukrywam klawiaturę

getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); 
((InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE)) 
        .hideSoftInputFromWindow(getView().getWindowToken(), 0); 

Z technicznego punktu widzenia dodałem 300 ms opóźnienia przed uruchomieniem żądania wyświetlenia klawiatury miękkiej. Dziwne, prawda? Zmieniono również requestFocus() na requestFocusFromTouch().

EDYCJA: Nie używaj requestFocusFromTouch(), ponieważ daje to wydarzenie dotykowe w programie uruchamiającym. Trzymaj się z requestFocus().

EDIT2: w oknach dialogowych (DialogFragment), użyj następujących

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

zamiast

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

'requestFocusFromTouch()' wydaje się wywołać zdarzenie dotyku w programie uruchamiającym. To dziwne. – EpicPandaForce

0
 field.post(new Runnable() { 
      @Override 
      public void run() { 
       field.requestFocus(); 
       field.onKeyUp(KeyEvent.KEYCODE_DPAD_CENTER, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_CENTER)); 
      } 
     }); 
Powiązane problemy