Clavier contextuel automatique au démarrage de l'activité


97

J'ai une question relativement simple. J'ai une activité avec beaucoup d'EditText en eux. Lorsque j'ouvre l'activité, elle se concentre automatiquement sur le premier EditText et affiche le clavier virtuel.

Comment éviter cela?


Vérifiez ma réponse à cette question stackoverflow.com/questions/39593324/…
Aide Android

Lorsque mon application est lancée (ouverte) et si la vue d'édition de texte est disponible, le clavier est activé automatiquement (afficher). Comment résoudre ce problème cliquez ici easycomacademy.com
...

Réponses:


209

Utilisez ces attributs dans votre balise de mise en page dans un fichier XML:

android:focusable="true"
android:focusableInTouchMode="true"

Comme indiqué par d'autres membres dans les commentaires, cela ne fonctionne pas, ScrollViewvous devez donc ajouter ces attributs à l'enfant principal de ScrollView.


3
Cela a également résolu mon problème. J'ai ajouté ceci à la balise RelativeLayout pour mon activité. Je vous remercie!
Luc

21
Il est intéressant, il n'a pas fonctionné quand j'ai ajouté ci - dessus à un ScrollView, mais il a travaillé pour un LinearLayout
Brady Jerry

1
Je pense que vous devez le mettre sur la meilleure disposition
Utsav Gupta

Donc, je suppose que cela fonctionne parce que vous dites à la mise en page elle-même qu'elle peut avoir le focus? Sinon, il suppose qu'il doit donner le focus au premier contrôle sur le formulaire? Curieusement, j'obtenais le clavier même si tous les contrôles de mon formulaire étaient désactivés. Corrigé maintenant. Je vous remercie!
crowmagnumb

1
Il est important de noter que cette solution crée des problèmes d'accessibilité (une vue qui ne devrait pas être focalisable étant marquée comme ayant une focalisation) et pourrait avoir des conséquences inattendues.
Renato

96

Vous pouvez ajouter ceci à votre activité de manifeste Android:

android:windowSoftInputMode="stateHidden|adjustResize"

Cela fonctionne, cependant si vous avez un arrière-plan d'image et que vous craignez que votre clavier android:windowSoftInputMode="stateHidden|adjustPan"
logiciel ne

31

J'ai plusieurs implémentations décrites ici, mais maintenant j'ai ajouté dans le AndroidManifest.xmlpour ma Activitypropriété:

android:windowSoftInputMode="stateAlwaysHidden"

Je pense que c'est le moyen le plus simple, même si vous utilisez fragments.

" stateAlwaysHidden " Le clavier virtuel est toujours masqué lorsque la fenêtre principale de l'activité a le focus d'entrée.


cela a fonctionné pour moi à la fois avec un ScrollView et un RelativeLayout.
iversoncru

Ce n'est pas si génial pour les fragments, car vous associez "l'état caché" à l'activité qui contiendra tous vos fragments, ce qui signifie que tout fragment que vous souhaitez afficher dans l'activité sera affecté par la propriété (pas sur un "par fragment" " base).
Pelpotronic

11

Si vous avez une autre vue de votre activité comme un ListView, vous pouvez également faire:

ListView.requestFocus(); 

dans votre onResume () pour récupérer le focus du fichier editText.

Je sais que cette question a reçu une réponse, mais je propose simplement une solution alternative qui a fonctionné pour moi :)


5

https://stackoverflow.com/a/11627976/5217837 C'est presque correct:

@Override
public void onCreate(Bundle savedInstanceState) {

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

}

Mais ce devrait être SOFT_INPUT_STATE_HIDDEN plutôt que SOFT_INPUT_STATE_ALWAYS_VISIBLE


4

Utilisez ceci dans le code de votre activité:

@Override
public void onCreate(Bundle savedInstanceState) {

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

}

Cela n'a pas fonctionné pour moi - le clavier apparaissait toujours lorsque je commençais mon activité.
David Doria

Vous pouvez consulter ce lien, cela fonctionnera: stackoverflow.com/questions/18977187/…
Sujeet Kumar Gupta le

3

J'ai eu un problème similaire, même lors du changement d'onglets, le clavier est apparu automatiquement et est resté en place, avec Android 3.2.1 sur une tablette. Utilisez la méthode suivante:

public void setEditTextFocus(EditText searchEditText, boolean isFocused)
{
    searchEditText.setCursorVisible(isFocused);
    searchEditText.setFocusable(isFocused);
    searchEditText.setFocusableInTouchMode(isFocused);
    if (isFocused) {
        searchEditText.requestFocus();
    } else {
        InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
        inputManager.hideSoftInputFromWindow(searchEditText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS );
    }
}   

Dans le onCreate () et dans le onPause () de l'activité pour chaque EditText:

setEditTextFocus (myEditText, false);

Pour chaque EditText un OnTouchListener:

    myEditText.setOnTouchListener(new EditText.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            setEditTextFocus(myEditText, true); 
            return false;
        }
    });

Pour chacun EditTextdans le OnEditorActionListener:

    myEditText.setOnEditorActionListener(new EditText.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) {
                            .......
            setEditTextFocus(myEditText, false); 
            return false;
        }
    });

Et pour chacun EditTextdans le layout xml:

            android:imeOptions="actionDone"
            android:inputType="numberDecimal|numberSigned" // Or something else

Il y a probablement plus d'optimisation de code possible.


3
((InputMethodManager)getActivity().getSystemService("input_method")).hideSoftInputFromWindow(this.edittxt.getWindowToken(), 0);

en utilisant un fragment .. ce code fonctionne pour cacher le clavier ... quand un fragment ouvert évite le focus sur le clavier de champ edittext ...
Sreelal S

2

J'ai trouvé cette solution simple qui a fonctionné pour moi. Définissez ces attributs dans votre mise en page parent:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainLayout"
android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true" >

Et maintenant, lorsque l'activité démarre, cette mise en page principale sera mise au point par défaut.

En outre, nous pouvons supprimer le focus des vues enfants au moment de l'exécution en redonnant le focus à la disposition principale, comme ceci:

findViewById(R.id.mainLayout).requestFocus();

J'espère que cela fonctionnera pour vous.


1

c'est la solution que j'utilise, ce n'est pas la meilleure solution mais ça marche bien pour moi

 editComment.setFocusableInTouchMode(false);
 editComment.setOnTouchListener(new OnTouchListener(){

                @Override
                public boolean onTouch(View v, MotionEvent event)
                {
                    // TODO Auto-generated method stub
                    editComment.setFocusableInTouchMode(true);
                     editComment.requestFocus() ;
                    return false;
                }});

1

Fait intéressant, cette documentation https://developer.android.com/training/keyboard-input/visibility.html indique que lorsqu'une activité démarre et que le focus est donné à un champ de texte, le clavier logiciel n'est pas affiché (puis passe à vous montre comment afficher le clavier si vous le souhaitez avec du code).

Sur mon Samsung Galaxy S5, voici comment fonctionne mon application (sans entrée manifeste ni code spécifique) - pas de clavier logiciel. Cependant, sur un Lollipop AVD, un clavier virtuel est affiché - contrairement à la doc donnée ci-dessus.

Si vous obtenez ce comportement lors d'un test dans un AVD, vous souhaiterez peut-être effectuer un test sur un appareil réel pour voir ce qui se passe.


1

Cela a de bonnes réponses à l'article suivant: Arrêtez EditText de se concentrer au démarrage de l'activité . Celui que j'utilise régulièrement est le code suivant de Morgan :

<!-- Dummy item to prevent AutoCompleteTextView from receiving focus -->
<LinearLayout
    android:focusable="true" 
    android:focusableInTouchMode="true"
    android:layout_width="0px" 
    android:layout_height="0px"/>

<!-- :nextFocusUp and :nextFocusLeft have been set to the id of this component
to prevent the dummy from receiving focus again -->
<AutoCompleteTextView android:id="@+id/autotext"
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:nextFocusUp="@id/autotext"     
    android:nextFocusLeft="@id/autotext"/>

REMARQUE : élément factice doit être PLACÉ AVANT l'élément focalisable.

Et je pense que cela devrait fonctionner parfaitement même avec ScrollView et que cela n'a pas non plus eu de problèmes d'accessibilité.


0

Cela se produit lorsque votre EditText obtient automatiquement le focus au début de votre activité. Donc, un moyen simple et stable de résoudre ce problème consiste simplement à définir le focus initial sur n'importe quelle autre vue, telle qu'un bouton, etc.

Vous pouvez le faire dans votre mise en page XML, aucun code requis.


0

La réponse acceptée ne fonctionne pas pour moi, c'est pourquoi donner une solution de travail de réponse, cela peut être utile!

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

Maintenant, le clavier est ouvert profitez :)


La question était de savoir comment empêcher le clavier de s'ouvrir.
jk7


0

Ajoutez le code ci-dessous à votre haut de l'activité XML et assurez-vous que la vue est au-dessus de EditText

<View 
android:layout_width="0dp"
android:layout_height="0dp"
android:focusableInTouchMode="true"/>

0

android:focusableInTouchMode="true"

Ajoutez la ligne ci-dessus au xml de EditTextou TextInputLayoutqui a le focus et provoque lesoftInputKeyboard apparaître le.

Cela a résolu le problème pour nous et maintenant le clavier ne s'affiche pas


0

search_edit_text = (EditText) findViewById (R.id.search_edit_text);

    search_edit_text.requestFocus();
    search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN , 0, 0, 0));
    search_edit_text.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_UP , 0, 0, 0));

Cela fonctionne pour moi, les fragments peuvent avoir une syntaxe différente. CELA FONCTIONNE POUR L'ACTIVITÉ


Vous devez fournir toutes les limitations, hypothèses ou simplifications dans votre réponse. Voir plus de détails sur la façon de répondre à ce lien: stackoverflow.com/help/how-to-answer
Usama Abdulrehman

-1

Si votre vue contient EditText et Listview, le clavier s'ouvrira par défaut. Pour empêcher le clavier de s'afficher par défaut, procédez comme suit

this.listView.requestFocus();

Assurez-vous que vous demandez le focus sur la liste après avoir obtenu la vue pour editText.

Pour par exemple

this.listView = (ListView) this.findViewById(R.id.list);
this.editTextSearch = (EditText) this.findViewById(R.id.editTextSearch);
this.listView.requestFocus();

Si vous le faites, editText obtiendra le focus et le clavier apparaîtra.


J'ai fait cela mais le clavier apparaît toujours et l'accent est mis sur editText.
David Doria
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.