Ouvrir le clavier virtuel par programme


116

J'ai une activité sans widgets enfants et le fichier xml correspondant est,

<?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>

et je veux ouvrir le clavier virtuel par programme pendant que l'activité démarre.et ce que j'ai essayé jusqu'à présent, c'est,

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);
    }

Donnez-moi quelques conseils.


salut vignesh mais quel est le besoin d'ouvrir le clavier logiciel sans aucun textView?
milind

En fait, j'essaie d'utiliser un auditeur clé dans cette activité, pour cela, je dois le faire.
Vignesh

Ce que vous avez fait est correct. Je ne sais pas pourquoi vous ne voyez pas le clavier. J'ai utilisé ce code une fois pour lancer le clavier sans aucune action de l'utilisateur sur un editText et cela a réussi.
Vinoth

Salut Vinoth, j'ai changé mon code aussi exactement que les messages de DSouza et j'ai également mis à jour ma question, alors vérifiez s'il y a quelque chose que je dois changer.
Vignesh

Réponses:


145

J'ai utilisé les lignes suivantes pour afficher le clavier virtuel manuellement à l'intérieur de l'événement onclick, et le clavier est visible.

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

Mais je ne suis toujours pas en mesure de l'ouvrir pendant que l'activité s'ouvre, alors y a-t-il une solution pour cela?


@YosiTaguri, beaucoup plus élégant si vous avez affaire à des activités. Et qu'en est-il des fragments?! +1 pour les deux réponses
S.Thiongane

et que se passe-t-il si vous devez ouvrir le clavier dans une boîte de dialogue ayant modifier le texte? Comment faire ça?
seema

5
@Vignesh: vous devez donner un délai de 500 millisecondes à l'ouverture du clavier si vous souhaitez implémenter ce code au moment du lancement de l'activité.
Vinit Saxena

@vinitsaxena Merci pour votre précieux commentaire
Vignesh

je ne suis pas sûr mais j'ai essayé d'obtenir n'importe quelle vue par exemple TextView et ajouter un auditeur comme ceci myTextView.post (new Runnable () {public void run () {// ici votre méthode}}); et lorsque cette vue sera créée, cela signifie que tout l'écran est maintenant visible, vous pouvez appeler ce que vous voulez
Aleksey Timoshchenko

121

Dans votre fichier manifeste, essayez d'ajouter ce qui suit au <activity>que vous souhaitez afficher le clavier lorsque l'activité démarre:

android:windowSoftInputMode="stateVisible"

Cela devrait rendre le clavier visible au début de l'activité.

Pour plus d'options, consultez la documentation .


3
J'aimerais pouvoir voter plus souvent pour cette réponse juste pour obtenir tous ces sales hacks au bas de la page;)
fjdumont

Comment faites-vous cela par programme? Je veux que le clavier s'affiche automatiquement dans certaines situations.
phreakhead

1
J'ai une boîte de dialogue de saisie comme ce lien lien comment afficher le clavier non pas sur l'activité mais à l'invite? cela a fonctionné grâce à <code> InputMethodManager inputMethodManager = (InputMethodManager) getSystemService (Context.INPUT_METHOD_SERVICE); if (inputMethodManager! = null) {inputMethodManager.toggleSoftInput (InputMethodManager.SHOW_FORCED, 0); } <code>
shareef

7
Il dit «par programme».
Mert Akcakaya

2
Ça ne marche pas pour moi. Au lieu de cela, cela fait: android: windowSoftInputMode = "stateAlwaysVisible"
Rendicahya

34

Veuillez suivre le code ci-dessous. Je suis sûr que votre problème sera résolu.

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

Salut, je viens de coller votre code dans la fonction onCreate mais il n'y a toujours pas de changement dans mon activité, si vous voulez que je colle le code, je vais le coller en commentaire.
Vignesh

Lorsque vous souhaitez accéder au clavier logiciel, veuillez me le dire afin que je résolve votre problème. S'il vous plaît envoyez-moi le code .... si possible
AndroidDanger

Je veux définir onKeyboardActionListener pour mon activité qui n'a rien d'autre qu'une disposition linéaire.
Vignesh

Voir juste ma question ci-dessus dans laquelle j'ai édité le code avec ce que vous m'avez fourni.
Vignesh

Cette activité est uniquement pour l'action au clavier, je veux écouter chaque touche enfoncée (en utilisant onKeyboardActionListener) et je la transmettrai au serveur local simultanément
Vignesh

25

Cela fonctionne

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

ou

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

2
Merci pour la manière programmatique de définir cela - cela fonctionne, contrairement aux hacks InputMethodManager.
Martin Vysny

17

Tout ce dont j'avais besoin était d'exposer le clavier, dans un moment très précis. Cela a fonctionné pour moi! Merci Benites.

    private Handler mHandler= new Handler();

Et au moment très précis:

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

Cette solution a fonctionné pour moi à l'intérieur de onResume () avec une légère modification sur le retard de l'action post: postDelayed( runnable, 500 /* msec */ );
AVIDeveloper

1
Je recommanderais de le mettre dans un rappel ViewTreeObserver afin qu'il soit appelé sur la première mise en page pour éviter d'avoir à attendre un laps de temps arbitraire. Il devrait être plus sûr / plus réactif.
Gabriel

Seule cette solution a fonctionné pour moi. J'avais des méthodes précédentes qui fonctionnaient mais malheureusement pour le dernier système d'exploitation, le gestionnaire est la solution viable.
MD. Shafiul Alam Biplob

12

J'ai utilisé les lignes suivantes pour afficher le clavier virtuel manuellement dans l'événement 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

Mettez cela dans la méthode 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();
    }
});

le runnable est nécessaire car lorsque le système d'exploitation déclenche la méthode onResume, vous ne pouvez pas être sûr que toutes les vues soient dessinées, donc la méthode de publication appelée à partir de votre disposition racine fait attendre que chaque vue soit prête.


1
J'avais un SearchView dans un DialogFragment et la première fois que le Dialog est apparu, le SearchView avait le focus ... mais le clavier n'était PAS en place à moins que l'utilisateur ne le touche. Nous avions essayé d'utiliser simplement showSoftInput et également basculerSoftInputFromWindow à partir de OnResume ALONE ... ou même dans OnFocusChangeListener pour SearchView ... mais aucun de ceux-ci ne fonctionnait car ils semblaient se déclencher avant que la fenêtre ne soit ouverte et dessinée ..... .l'utilisation de cet événement de publication dans OnResume l'a finalement résolu.
lepert

8

semble que cela fonctionne

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

semble que cela fonctionne mieux: en manifeste:

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

semble que le manifeste fonctionne sous Android 4.2.2 mais ne fonctionne pas sous Android 4.0.3


8

dans onCreate procédé de l' activité ou onActivityCreated d'un fragment

....
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

J'ai utilisé comme ça pour afficher le clavier logiciel par programme et cela fonctionne pour moi pour empêcher le redimensionnement automatique de l'écran lors du lancement du clavier.

En manifeste:

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

Dans 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);

Je suppose que cela permettra aux autres de gagner du temps pour rechercher ce problème.


Fonctionne, mais le clavier reste visible même si vous quittez l'application, et une fois que vous fermez le clavier si vous ouvrez à nouveau l'application, le clavier n'apparaît pas
nulll

Je n'ai pas rencontré ce problème jusqu'à présent. Je suppose que c'est un problème de périphérique.
Noundla Sandeep

Pourquoi la minuterie est-elle nécessaire? Pouvez-vous ajouter des liens pour aller plus loin?
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)
}

Java

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

Je l'ai utilisé comme singleton comme:

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

Utilisez-le dans votre activité comme:

showSoftKeyboard(this, yourEditTextToFocus);

Merci beaucoup d'avoir inclus un court extrait sur la façon d'utiliser la fonction ainsi que la fonction elle-même. Cela fonctionne exactement comme j'en avais besoin!
Chad Wilson le

3

Cela marche:

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);
}

Et vous appelez cette méthode comme ceci:

showKeyboard(NameOfActivity.this);

2

InputMethodManager.SHOW_FORCED n'est pas un bon choix. Si vous utilisez ce paramètre, vous devez gérer le masquage de l'état du clavier. Ma suggestion est comme ça;

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

En outre, vous pouvez vous concentrer sur la vue (généralement EditText) en prenant les paramètres. Cela en fait une fonction plus utile

pour plus d'informations sur InputMethodManager.SHOW_IMPLICIT et SHOW_FORCED; InputMethodManager


1

Voici le code source requis:

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);}

Pour plus de détails, veuillez suivre ce lien. Cela m'a aidé. https://github.com/Nikhillosalka/Keyboard/blob/master/README.md


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

Utilisez le code ci-dessus dans onResume () pour ouvrir le clavier logiciel


1

Semblable à la réponse de @ShimonDoodkin, voici ce que j'ai fait dans un fragment.

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

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

ShowKeyboardest

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);
    }
}

Après une saisie réussie, je m'assure également de masquer le clavier

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

Il y a déjà trop de réponses mais rien n'a fonctionné pour moi à part ça

inputMethodManager.showSoftInput(emailET,InputMethodManager.SHOW_FORCED);

J'ai utilisé showSoftInputavecSHOW_FORCED

Et mon activité a

 android:windowSoftInputMode="stateVisible|adjustResize"

j'espère que cela aide quelqu'un


0

Publiez cette méthode dans votre activité de base et utilisez-la d'autres activités comme un charme

public void openKeyboard() {
    InputMethodManager imm =
            (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    if (imm != null) {
        imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.