[Android] Arrêtez EditText d'obtenir le focus au démarrage de l'activité



Answers

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 suite à la mise au point de EditText ? Je ne vois pas vraiment de problème avec le EditText mettant l'accent sur le démarrage, mais c'est certainement un problème d'avoir la fenêtre softInput ouverte quand l'utilisateur n'a pas explicitement demandé de se concentrer sur EditText (et d'ouvrir le clavier).

Si c'est le problème du clavier virtuel, consultez la documentation de l' élément AndroidManifest.xml <activity> .

android:windowSoftInputMode="stateHidden" - cachez-le toujours lors de la saisie de l'activité.

ou android:windowSoftInputMode="stateUnchanged" - ne le changez pas (par exemple, ne le montrez pas s'il n'est pas déjà affiché, mais s'il était ouvert lors de la saisie de l'activité, laissez-le ouvert).

Question

J'ai une Activity sur Android, avec deux éléments:

  1. EditText
  2. ListView

Lorsque mon Activity commence, l' EditText immédiatement un 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 EditText de ne pas se sélectionner lorsque l' Activity démarre?




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éfinissez les attributs android:focusable="true" et android:focusableInTouchMode="true"

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




Assurez-vous de supprimer la ligne "<requestFocus />" de la balise EditText en XML.

<EditText
   android:id="@+id/input"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content">

   <requestFocus /> <!-- remove this line --> 
</EditText>



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>



Ajouter suivant dans la méthode onCreate :

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);



Etant donné que je n'aime pas polluer le XML avec quelque chose qui est lié à la fonctionnalité, j'ai créé cette méthode qui "vole" de façon transparente le focus de la première vue focalisable puis s'assure de se retirer quand c'est nécessaire!

public static View preventInitialFocus(final Activity activity)
{
    final ViewGroup content = (ViewGroup)activity.findViewById(android.R.id.content);
    final View root = content.getChildAt(0);
    if (root == null) return null;
    final View focusDummy = new View(activity);
    final View.OnFocusChangeListener onFocusChangeListener = new View.OnFocusChangeListener()
    {
        @Override
        public void onFocusChange(View view, boolean b)
        {
            view.setOnFocusChangeListener(null);
            content.removeView(focusDummy);
        }
    };
    focusDummy.setFocusable(true);
    focusDummy.setFocusableInTouchMode(true);
    content.addView(focusDummy, 0, new LinearLayout.LayoutParams(0, 0));
    if (root instanceof ViewGroup)
    {
        final ViewGroup _root = (ViewGroup)root;
        for (int i = 1, children = _root.getChildCount(); i < children; i++)
        {
            final View child = _root.getChildAt(i);
            if (child.isFocusable() || child.isFocusableInTouchMode())
            {
                child.setOnFocusChangeListener(onFocusChangeListener);
                break;
            }
        }
    }
    else if (root.isFocusable() || root.isFocusableInTouchMode())
        root.setOnFocusChangeListener(onFocusChangeListener);

    return focusDummy;
}



Écrivez ce code dans le fichier Manifest dans l' Activity où vous ne voulez pas ouvrir le clavier.

android:windowSoftInputMode="stateHidden"

Fichier manifeste

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.projectt"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="24" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
         <activity
            android:name=".Splash"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".Login"
            **android:windowSoftInputMode="stateHidden"**
            android:label="@string/app_name" >
        </activity>

    </application>

</manifest>



J'avais besoin de dégager l'attention de tous les domaines par programme. J'ai simplement ajouté les deux instructions suivantes à ma définition de mise en page principale.

myLayout.setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
myLayout.setFocusableInTouchMode(true);

C'est tout. Correction de mon problème instantanément. Merci, Silver, de m'avoir indiqué la bonne direction.




C'est la solution parfaite et la plus simple. Je l'utilise toujours dans mon application.

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



Vous pouvez simplement définir "focusable" et "focusable en mode tactile" pour donner la valeur true au premier TextView de la layout . De cette façon, lorsque l'activité démarre, le TextView sera mis au point mais, en raison de sa nature, vous ne verrez rien de concentré sur l'écran et, bien sûr, aucun clavier ne sera affiché ...




Essayez clearFocus() au lieu de setSelected(false) . Chaque vue dans Android a à la fois la possibilité de mise au point et la sélection, et je pense que vous voulez juste vous concentrer sur le sujet.




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



Pour moi, ce qui a fonctionné sur tous les appareils est la suivante:

    <!-- fake first focusable view, to allow stealing the focus to itself when clearing the focus from others -->

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

Juste mettre cela comme une vue avant la vue focalisée problématique, et c'est tout.




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

ListView.requestFocus(); 

dans votre onResume() pour récupérer le focus de l' editText .

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




À onCreate de votre activité, il suffit d'ajouter use clearFocus() sur votre élément EditText. Par exemple,

edittext = (EditText) findViewById(R.id.edittext);
edittext.clearFocus();

Et si vous souhaitez détourner le focus vers un autre élément, utilisez requestFocus() pour cela. Par exemple,

button = (Button) findViewById(R.id.button);
button.requestFocus();



Links