android focus clearfocus - Empêcher EditText de se concentrer au démarrage de l'activité




15 Answers

Excellentes réponses de Luc et Mark, mais il manque un bon exemple de code. Ajouter la balise android:focusableInTouchMode="true" à <LinearLayout> comme dans l'exemple suivant <LinearLayout> 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"/>
unfocused lose

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

  1. EditText
  2. ListView

Lorsque mon Activity commence, l' EditText immédiatement le focus (curseur clignotant). Je ne veux pas qu'un contrôle ait le focus d'entrée au démarrage. J'ai essayé:

EditText.setSelected(false);

Pas de chance. Comment puis-je convaincre le EditText de ne pas se sélectionner lui-même au démarrage de l' Activity ?




Une solution plus simple existe. 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é commence, cette disposition principale aura le focus par défaut.

En outre, nous pouvons supprimer le focus des vues enfant au moment de l'exécution (par exemple, une fois la modification de l'enfant terminée) en redonnant le focus à la présentation principale, comme suit:

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

Bon commentaire de Guillaume Perrot :

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

En réalité, nous pouvons constater que les beforeDescendants définis par défaut dans la méthode ViewGroup.initViewGroup() (Android 2.2.2). Mais pas égal à 0. ViewGroup.FOCUS_BEFORE_DESCENDANTS = 0x20000;

Merci à Guillaume.




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

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

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



Ce qui suit empêchera edittext de prendre le focus lors de sa création, mais le saisira lorsque vous les toucherez.

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

Donc, vous définissez focusable sur false dans le 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;
    }
});

Parce que vous retournez false, c'est-à-dire que vous ne consommez pas l'événement, le comportement de la mise au point se déroulera normalement.




J'avais essayé plusieurs réponses individuellement mais l'accent est toujours sur EditText. J'ai seulement réussi à le résoudre en utilisant deux des solutions ci-dessous 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://.com/a/8639921/15695 )

et enlever

 <requestFocus />

à EditText

(Référence de floydaddict share )




Solution simple: dans AndroidManifest dans l'utilisation des balises d' Activity

android:windowSoftInputMode="stateAlwaysHidden"



Ce qui suit a fonctionné pour moi dans Manifest . Écrire ,

<activity
android:name=".MyActivity"
android:windowSoftInputMode="stateAlwaysHidden"/>



Ajouter android:windowSoftInputMode="stateAlwaysHidden" dans la balise d'activité du fichier Manifest.xml .

Source




Si vous avez une autre vue de votre activité, telle qu'une ListView , vous pouvez également effectuer les ListView :

ListView.requestFocus(); 

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

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




Ajoutez la méthode onCreate suivante:

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



Etant donné que je n'aime pas polluer le XML avec quelque chose lié aux fonctionnalités, j'ai créé cette méthode qui "transparent" vole le focus de la première vue focalisable et s'assure ensuite de se supprimer si 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 cette ligne dans votre mise en page parent ...

 android:focusableInTouchMode="true"



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

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



Écrivez ce code dans le fichier Manifest de 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>



Sur onCreate de votre activité, ajoutez simplement use clearFocus() à 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() sur cela. Par exemple,

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



Related