web-dev-qa-db-fra.com

Ouverture automatique du clavier au démarrage

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 puis-je empêcher cela?

92
Galip

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, il ne fonctionne pas sur ScrollView et vous devez donc ajouter ces attributs à l'enfant principal de ScrollView.

202
Vikas Patidar

Vous pouvez ajouter ceci à votre activité Manifest Android: 

Android:windowSoftInputMode="stateHidden|adjustResize"
94
Mobile Bloke

J'ai plusieurs implémentations décrites ici, mais maintenant j'ai ajouté dans le AndroidManifest.xml pour ma Activity la propriété:

Android:windowSoftInputMode="stateAlwaysHidden"

Je pense que c'est la solution de facilité, même si vous utilisez fragments.

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

30
Elenasys

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

ListView.requestFocus(); 

dans votre onResume () pour obtenir le focus de editText.

Je sais que cette question a été résolue mais fournit juste une solution alternative qui a fonctionné pour moi :)

11
Sid

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 cela devrait être SOFT_INPUT_STATE_HIDDEN plutôt que SOFT_INPUT_STATE_ALWAYS_VISIBLE

4
Brent Young

Utilisez ceci dans le code de votre activité:

@Override
public void onCreate(Bundle savedInstanceState) {

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

}
3
Bobs

J'ai eu un problème similaire, même en changeant de tabulation, 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 onCreate () et 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 chaque EditText dans OnEditorActionListener:

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

Et pour chaque EditText dans le layout xml:

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

Il y a probablement plus de code à optimiser possible.

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

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

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

Et maintenant, quand l'activité commence, cette disposition principale aura le focus par défaut.

De même, nous pouvons supprimer le focus des vues enfant 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. 

2
Salman Nazir

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é sur un champ de texte, le clavier logiciel n'est pas affiché (et continue ensuite pour vous montrer comment afficher le clavier si vous voulez utiliser du code).

Sur mon Samsung Galaxy S5, voici comment fonctionne mon application (sans saisie de manifeste ni code spécifique) - sans clavier logiciel. Cependant, sur un AVD Lollipop, un clavier logiciel est affiché, ce qui contrevient à la documentation donnée ci-dessus.

Si vous rencontrez ce problème lors d'un test sur un DAV, vous pouvez tester sur un périphérique réel pour voir ce qui se passe.

1
Steve Waring

Cela a quelques bonnes réponses au post suivant: Empêchez 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'élément factice doit être placé juste avant l'élément à activer.

Et je pense que cela devrait fonctionner parfaitement, même avec ScrollView, et que cela n’a eu aucun problème d’accessibilité.

1
Kaushik NP

c’est la solution que j’utilise, ce n’est pas la meilleure solution mais elle fonctionne 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
Paul Roosens

Android: windowSoftInputMode = "stateHidden | adjustResize"

Fonctionne bien

0
Softlabsindia

Réponse acceptée ne fonctionne pas pour moi, c'est pourquoi donner une réponse solution de travail, peut-être que c'est 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 profiter :)

0
Yogesh Rathi

Ajoutez le code ci-dessous en 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
Aabauser

Android:focusableInTouchMode="true"

Ajoutez la ligne ci-dessus au xml de EditText ou TextInputLayout qui a le focus et fait apparaître la softInputKeyboard.

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

0
Sheraz Ahmad Khilji

Cela se produit lorsque votre EditText obtient automatiquement le focus comme lorsque votre activité commence. Un moyen simple et stable de résoudre ce problème consiste donc simplement à définir le focus initial sur une autre vue, telle qu'un bouton, etc. 

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

0
Mtl Dev