Question Arrêtez EditText d'obtenir le focus au démarrage de l'activité


j'ai un Activity en Android, avec deux éléments:

  1. EditText 
  2. ListView

Quand mon Activity commence, le EditText a immédiatement le focus d'entrée (curseur clignotant). Je ne veux pas que tout contrôle ait une focalisation d'entrée au démarrage. J'ai essayé:

EditText.setSelected(false);

Pas de chance. Comment puis-je convaincre le EditText ne pas se sélectionner quand le Activity départs?


2386
2017-10-12 15:03


origine


Réponses:


Excellentes réponses de Luc et Mark cependant un bon échantillon de code est manquant. Ajouter le tag android:focusableInTouchMode="true" à <LinearLayout> comme l'exemple suivant va résoudre le problème.

<!-- 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"/>

2026
2017-11-02 15:49



Est-ce que le problème réel est que vous ne voulez pas qu'il se concentre du tout? Ou vous ne voulez pas qu'il affiche le clavier virtuel à la suite de la mise au point EditText? Je ne vois pas vraiment de problème avec le EditText en mettant l'accent sur le démarrage, mais il est certainement un problème pour avoir la fenêtre softInput ouverte lorsque l'utilisateur n'a pas explicitement demandé de se concentrer sur le EditText (et ouvrez le clavier en conséquence).

Si c'est le problème du clavier virtuel, voir le AndroidManifest.xml  élément <activity> Documentation.

android:windowSoftInputMode="stateHidden" - cachez-le toujours lorsque vous entrez dans l'activité.

ou android:windowSoftInputMode="stateUnchanged" - ne le changez pas (par exemple, ne le faites pas montrer si elle n'est pas déjà affichée, mais si elle était ouverte lors de l'entrée de l'activité, laissez-la ouverte).


1565
2018-04-09 21:22



Une solution plus simple existe. Définissez ces attributs dans votre mise en page parente:

<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é commence, cette mise en page principale sera mise en évidence par défaut.

De même, nous pouvons supprimer le focus des vues enfant au moment de l'exécution (par exemple, après avoir terminé la modification de l'enfant) en donnant de nouveau le focus à la mise en page principale, comme ceci:

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

Bon commentaire de Guillaume Perrot:

android:descendantFocusability="beforeDescendants" semble être le   par défaut (la valeur entière est 0). Cela fonctionne juste en ajoutant    android:focusableInTouchMode="true".

Vraiment, nous pouvons voir que le beforeDescendants défini par défaut dans le ViewGroup.initViewGroup() méthode (Android 2.2.2). Mais pas égal à 0. ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;

Merci à Guillaume.


1012
2017-12-26 23:35



La seule solution que j'ai trouvée est:

  • Créer un LinearLayout (Je ne sais pas si d'autres types de Layout fonctionneront)
  • Définir les attributs android:focusable="true" et android:focusableInTouchMode="true"

Et le EditText ne sera pas ciblé après le démarrage de l'activité


385
2017-10-23 08:12



Le problème semble provenir d'une propriété que je ne peux voir que dans XML form de la mise en page.

Assurez-vous de supprimer cette ligne à la fin de la déclaration dans le EditText Balises XML:

<requestFocus />

Cela devrait donner quelque chose comme ça:

<EditText
   android:id="@+id/emailField"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:inputType="textEmailAddress">

   //<requestFocus /> /* <-- without this line */
</EditText>

67
2018-03-13 09:57



en utilisant les informations fournies par d'autres affiches, j'ai utilisé la solution suivante:

dans la mise en page XML

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

<!-- AUTOCOMPLETE -->
<AutoCompleteTextView
    android:id="@+id/autocomplete"
    android:layout_width="200dip"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dip"
    android:inputType="textNoSuggestions|textVisiblePassword"/>

dans onCreate ()

private AutoCompleteTextView mAutoCompleteTextView;
private LinearLayout mLinearLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mylayout);

    //get references to UI components
    mAutoCompleteTextView = (AutoCompleteTextView) findViewById(R.id.autocomplete);
    mLinearLayout = (LinearLayout) findViewById(R.id.linearLayout_focus);
}

et enfin, dans onResume ()

@Override
protected void onResume() {
    super.onResume();

    //do not give the editbox focus automatically when activity starts
    mAutoCompleteTextView.clearFocus();
    mLinearLayout.requestFocus();
}

63
2018-05-26 21:07



Ce qui suit empêchera edittext de prendre le focus lors de sa création, mais saisissez-le lorsque vous le touchez.

<EditText
    android:id="@+id/et_bonus_custom"
    android:focusable="false" />

Donc, vous définissez focusable à false dans le fichier XML, mais la clé est dans le java, auquel vous ajoutez l'écouteur suivant:

etBonus.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        v.setFocusable(true);
        v.setFocusableInTouchMode(true);
        return false;
    }
});

Comme vous retournez faux, c'est-à-dire que vous ne consommez pas l'événement, le comportement de mise au point se déroule normalement.


58
2018-06-15 04:45



Essayer clearFocus () au lieu de setSelected(false). Chaque vue dans Android a à la fois une possibilité de mise au point et de sélection, et je pense que vous souhaitez simplement mettre l'accent sur ce point.


54
2017-10-12 19:02



J'avais essayé la réponse serval individuellement mais l'accent est toujours sur l'EditText. Je réussis seulement à le résoudre en utilisant deux de la solution ci-dessus ensemble.

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

(Référence de Silver https://stackoverflow.com/a/8639921/15695 )

et enlever

 <requestFocus />

à EditText

(Référence de floydaddict https://stackoverflow.com/a/9681809 )


43
2017-11-28 10:32



Aucune de ces solutions n'a fonctionné pour moi. La façon dont j'ai réparé l'autofocus était:

<activity android:name=".android.InviteFriendsActivity" android:windowSoftInputMode="adjustPan">
    <intent-filter >
    </intent-filter>
</activity>

37
2017-11-30 16:37



Solution simple: Dans AndroidManifest dans Activity utilisation de tag

android:windowSoftInputMode="stateAlwaysHidden"

31
2018-03-17 15:42