Otwórz programowo klawiaturę


116

Mam aktywność bez widżetów podrzędnych, a odpowiadający jej plik xml to:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/myLayout"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:focusable="true"
>
</LinearLayout>

i chcę programowo otwierać miękką klawiaturę podczas rozpoczynania działania. a do tej pory próbowałem:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (inputMethodManager != null) {
        inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }

Daj mi wskazówki.


cześć vignesh, ale jaka jest potrzeba otwierania miękkiej klawiatury bez tekstu TextView?
milind

Właściwie to staram się używać słuchacza kluczy w tej czynności, w tym celu muszę to zrobić.
Vignesh,

To, co zrobiłeś, jest poprawne. Nie wiem, dlaczego nie widzisz klawiatury. Użyłem tego kodu raz, aby uruchomić klawiaturę bez żadnej akcji użytkownika na editText i zakończyło się sukcesem.
Vinoth,

Cześć Vinoth, zmieniłem swój kod tak dokładnie, jak posty DSouza, a także zaktualizowałem moje pytanie, więc sprawdź, czy jest coś, co mam zmienić.
Vignesh,

Odpowiedzi:


145

Użyłem następujących wierszy, aby ręcznie wyświetlić klawiaturę programową wewnątrz zdarzenia onclick, a klawiatura jest widoczna.

InputMethodManager inputMethodManager =
    (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
inputMethodManager.toggleSoftInputFromWindow(
    linearLayout.getApplicationWindowToken(),
    InputMethodManager.SHOW_FORCED, 0);

Ale nadal nie mogę otworzyć tego, gdy działanie jest otwierane, więc czy jest na to jakieś rozwiązanie?


@YosiTaguri, znacznie bardziej eleganckie, jeśli zajmujesz się działaniami. A co z fragmentami ?! +1 dla obu odpowiedzi
S. Thiongane,

a co, jeśli musisz otworzyć klawiaturę w oknie dialogowym z edytowanym tekstem? Jak to zrobić?
wydaje się

5
@Vignesh: jeśli chcesz zaimplementować ten kod w momencie uruchamiania działania, musisz podać pewne opóźnienie, takie jak 500 milisekund podczas otwierania klawiatury.
Vinit Saxena

@vinitsaxena Dziękuję za cenny komentarz
Vignesh

Nie jestem pewien, ale próbowałem uzyskać dowolny widok, na przykład TextView i dołączyć odbiornik, taki jak ten myTextView.post (nowy Runnable () {public void run () {// tutaj twoja metoda}}); a kiedy ten widok zostanie utworzony, oznacza to, że cały ekran widoczny teraz możesz wywołać, co chcesz
Aleksey Timoshchenko

121

W pliku manifestu spróbuj dodać następujące elementy do tego <activity>, które chcesz wyświetlać na klawiaturze po rozpoczęciu działania:

android:windowSoftInputMode="stateVisible"

Powinno to spowodować, że klawiatura stanie się widoczna po rozpoczęciu działania.

Aby uzyskać więcej opcji, zapoznaj się z dokumentacją .


3
Chciałbym móc częściej głosować za tą odpowiedzią tylko po to, aby wszystkie te brudne hacki
znalazły

Jak to robisz programowo? Chcę, aby klawiatura wyświetlała się automatycznie tylko w określonych sytuacjach.
phreakhead

1
Mam wejściowe okno jak ten link linku Jak pokazać klawiaturę nie na aktywności, ale na szybka? to zadziałało dzięki <code> InputMethodManager inputMethodManager = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); if (inputMethodManager! = null) {inputMethodManager.toggleSoftInput (InputMethodManager.SHOW_FORCED, 0); } <code>
shareef

7
Mówi „programowo”.
Mert Akcakaya,

2
Na mnie to nie działa. Zamiast tego robi to: android: windowSoftInputMode = "stateAlwaysVisible"
Rendicahya,

34

Proszę postępować zgodnie z poniższym kodem. Jestem pewien, że Twój problem zostanie rozwiązany.

if (imm != null){
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);
   } 

Cześć, właśnie wkleiłem Twój kod do funkcji onCreate, ale nadal nie ma zmian w mojej aktywności, jeśli chcesz, żebym wkleił kod, wkleię w komentarzu.
Vignesh

Jeśli chcesz uzyskać dostęp do klawiatury programowej, powiedz mi, abym rozwiązał Twój problem. Proszę o przesłanie mi kodu .... jeśli to możliwe
AndroidDanger

Chcę ustawić onKeyboardActionListener dla mojej aktywności, która nie ma nic innego niż układ liniowy.
Vignesh

Zobacz tylko moje pytanie powyżej, w którym zredagowałem kod za pomocą tego, co mi podałeś.
Vignesh

Ta czynność jest tylko dla akcji klawiatury, chcę słuchać każdego naciśniętego klawisza (używając onKeyboardActionListener) i przekażę to jednocześnie do lokalnego serwera
Vignesh

25

To działa

<activity
    ...
    android:windowSoftInputMode="stateVisible" >
</activity>

lub

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

2
Dzięki za programowy sposób ustawienia tego - to działa, podczas gdy hacki InputMethodManager nie.
Martin Vysny

17

Wszystko, czego potrzebowałem, to odsłonić klawiaturę w bardzo precyzyjnym momencie. To zadziałało dla mnie! Dzięki Benites.

    private Handler mHandler= new Handler();

I w bardzo precyzyjnym momencie:

    mHandler.post(
    new Runnable() {
        public void run() {
            InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
            inputMethodManager.toggleSoftInputFromWindow(yourEditText.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);
            yourEditText.requestFocus();
        }
    }); 

To rozwiązanie działało dla mnie wewnątrz onResume () z niewielką modyfikacją w opóźnianiu akcji postu: postDelayed( runnable, 500 /* msec */ );
AVIDeveloper

1
Zalecałbym umieszczenie go w wywołaniu zwrotnym ViewTreeObserver, aby był wywoływany w pierwszym układzie, aby uniknąć konieczności czekania przez dowolną ilość czasu. Powinien być bezpieczniejszy / bardziej responsywny.
Gabriel

Tylko to rozwiązanie działało u mnie. Miałem wcześniejsze metody, które działały, ale niestety w przypadku najnowszego systemu operacyjnego program obsługi jest działającym rozwiązaniem.
MD. Shafiul Alam Biplob,

12

Użyłem następujących wierszy, aby ręcznie wyświetlić klawiaturę programową wewnątrz zdarzenia onclick.

public void showKeyboard(final EmojiconEditText ettext){
          ettext.requestFocus();
          ettext.postDelayed(new Runnable(){
            @Override public void run(){
              InputMethodManager keyboard=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
              keyboard.showSoftInput(ettext,0);
            }
          }
        ,200);
        }

9

Umieść to w metodzie onResume:

findViewById(R.id.root_view_of_your_activity_layout).post(
new Runnable() {
    public void run() {
        InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
        inputMethodManager.toggleSoftInputFromWindow(yourEditText.getApplicationWindowToken(),     InputMethodManager.SHOW_FORCED, 0);
        yourEditText.requestFocus();
    }
});

runnable jest potrzebny, ponieważ gdy system operacyjny uruchamia metodę onResume, nie możesz być pewien, że wszystkie widoki są rysowane, więc metoda post wywoływana z układu głównego sprawia, że ​​czeka, aż każdy widok będzie gotowy.


1
Miałem SearchView w DialogFragment i gdy pierwszy raz pojawił się Dialog, SearchView miał fokus ... ale klawiatura NIE była włączona, dopóki użytkownik jej nie dotknął. Próbowaliśmy po prostu użyć showSoftInput, a także toggleSoftInputFromWindow z OnResume ALONE ... lub nawet w OnFocusChangeListener dla SearchView ... ale żadne z nich nie działało, ponieważ wydawało się, że uruchomiły się, zanim okno zostało otwarte i narysowane ..... . użycie tego zdarzenia post w OnResume ostatecznie rozwiązało problem.
lepert

8

wygląda na to, że to działa

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_patientid);

        editText = (EditText)findViewById(R.id.selectPatient);
        //editText.requestFocus(); //works without that

    }

@Override
    protected void onResume() {

        findViewById(R.id.selectPatient).postDelayed(
        new Runnable() {
            public void run() {
                 editText.requestFocus();
                InputMethodManager inputMethodManager =  (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                inputMethodManager.showSoftInput(editText,InputMethodManager.SHOW_IMPLICIT);
            }
        },100);
        super.onResume();
    }

wydaje się, że to działa lepiej: w manifest:

<application>
    <activity
        android:name="com.doodkin.myapp.ReportActivity"
        android:label="@string/title_activity_report"
        android:screenOrientation="sensor" 
        android:windowSoftInputMode="stateHidden" > // add this or stateVisible
    </activity>
</application>

wygląda na to, że manifest działa w systemie Android 4.2.2, ale nie działa w systemie Android 4.0.3


8

w onCreate sposobu działania lub onActivityCreated fragmentu

....
view.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
        @Override
        public boolean onPreDraw() {
            view.removeOnPreDrawListener(this);
            InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);

            // !Pay attention to return `true`
            // Chet Haase told to 
            return true;
        }
    });

6

Użyłem w ten sposób do programowego wyświetlania miękkiej klawiatury i działa to dla mnie, aby zapobiec automatycznej zmianie rozmiaru ekranu podczas uruchamiania klawiatury.

W oczywisty sposób:

<activity android:name="XXXActivity" android:windowSoftInputMode="adjustPan">
</activity>

W XXXActvity:

EditText et =  (EditText))findViewById(R.id.edit_text);  
  Timer timer = new Timer();
            TimerTask task = new TimerTask() {

                @Override
                public void run() {
                    InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                    inputMethodManager.toggleSoftInputFromWindow(et.getApplicationWindowToken(), InputMethodManager.SHOW_FORCED, 0);

                }
            };
            timer.schedule(task, 200);

Zakładam, że zaoszczędzi to innym czasu na poszukiwanie tego problemu.


Działa, ale klawiatura pozostaje widoczna nawet po wyjściu z aplikacji, a po zamknięciu klawiatury, jeśli ponownie otworzysz aplikację, klawiatura nie pojawia się
nulll

Do tej pory nie miałem tego problemu. Zakładam, że to problem z urządzeniem.
Noundla Sandeep

Dlaczego potrzebny jest minutnik? Czy możesz dodać linki, aby wejść głębiej?
nulll

6

Kotlin

fun hideKeyboard(activity: Activity) {
    val view = activity.currentFocus
    val methodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.hideSoftInputFromWindow(view!!.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
}

private fun showKeyboard(activity: Activity) {
    val view = activity.currentFocus
    val methodManager = activity.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
    assert(view != null)
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT)
}

Jawa

public static void hideKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager methodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert methodManager != null && view != null;
    methodManager.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
}

private static void showKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager methodManager = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    assert methodManager != null && view != null;
    methodManager.showSoftInput(view, InputMethodManager.SHOW_IMPLICIT);
}

3
InputMethodManager inputMethodManager=(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_FORCED,0);

3

Użyłem go jako singletona:

public static void showSoftKeyboard(final Context context, final EditText editText) {
        try {
            editText.requestFocus();
            editText.postDelayed(
                    new Runnable() {
                        @Override
                        public void run() {
                            InputMethodManager keyboard = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
                            keyboard.showSoftInput(editText, 0);
                        }
                    }
                    , 200);
        } catch (NullPointerException npe) {
            npe.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Użyj go w swojej działalności, na przykład:

showSoftKeyboard(this, yourEditTextToFocus);

Bardzo dziękujemy za dołączenie krótkiego fragmentu opisującego sposób korzystania z funkcji, a także samej funkcji. Działa dokładnie tak, jak tego potrzebowałem!
Chad Wilson

3

To działa:

private static void showKeyboard(Activity activity) {
    View view = activity.getCurrentFocus();
    InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
}

I nazywasz tę metodę w ten sposób:

showKeyboard(NameOfActivity.this);

2

InputMethodManager.SHOW_FORCED nie jest dobrym wyborem. Jeśli używasz tego ustawienia, powinieneś zarządzać ukrywaniem stanu klawiatury. Moja sugestia jest następująca;

    public void showSoftKeyboard(View view) {
    InputMethodManager inputMethodManager = (InputMethodManager) getActivity().getSystemService(Activity.INPUT_METHOD_SERVICE);
    view.requestFocus();
    inputMethodManager.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
}

Możesz także skupić się na wyświetlaniu (zwykle EditText), przyjmując parametry. To sprawia, że ​​jest to bardziej użyteczna funkcja

aby uzyskać więcej informacji o InputMethodManager.SHOW_IMPLICIT i SHOW_FORCED; InputMethodManager


1

Oto wymagany kod źródłowy:

public static void openKeypad(final Context context, final View v) 
 {
new Handler().postDelayed(new Runnable() 
{
    @Override
    public void run() 
    {
        InputMethodManager inputManager =   (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE); 
        inputManager.showSoftInput(v, InputMethodManager.SHOW_IMPLICIT);    
        Log.e("openKeypad", "Inside Handler");
    }
},300);}

Aby uzyskać szczegółowe informacje, przejdź przez ten link. To mi pomogło. https://github.com/Nikhillosalka/Keyboard/blob/master/README.md


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

Użyj powyższego kodu w onResume (), aby otworzyć klawiaturę programową


1

Podobnie jak w przypadku odpowiedzi @ShimonDoodkin, oto co zrobiłem we fragmencie.

https://stackoverflow.com/a/29229865/2413303

    passwordInput.postDelayed(new ShowKeyboard(), 300); //250 sometimes doesn't run if returning from LockScreen

Gdzie ShowKeyboardjest

private class ShowKeyboard implements Runnable {
    @Override
    public void run() {
        passwordInput.setFocusableInTouchMode(true);
        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ę, że ukryłem klawiaturę

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

1
public final class AAUtilKeyboard {

public static void openKeyboard(final Activity activity, final EditText editText) {
    final InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.showSoftInput(editText, InputMethodManager.SHOW_IMPLICIT);
    }
}

public static void hideKeyboard(final Activity activity) {
    final View view = activity.getCurrentFocus();
    if (view != null) {
        final InputMethodManager imm = (InputMethodManager) activity.getSystemService(Context.INPUT_METHOD_SERVICE);
        if (imm != null) {
            imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
        }
    }
}

0

Odpowiedzi jest już za dużo, ale poza tym nic nie działało

inputMethodManager.showSoftInput(emailET,InputMethodManager.SHOW_FORCED);

Używałem showSoftInputzSHOW_FORCED

I moja działalność tak

 android:windowSoftInputMode="stateVisible|adjustResize"

mam nadzieję, że to komuś pomoże


0

Opublikuj tę metodę w swojej podstawowej aktywności i używaj jej do innych działań, takich jak talizman

public void openKeyboard() {
    InputMethodManager imm =
            (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }
}
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.