when - unfocused edittext android




Empêcher EditText de se concentrer au démarrage de l'activité (20)

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 ?


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

Écrivez cette ligne dans votre mise en page parent ...

 android:focusableInTouchMode="true"

Ajoutez la méthode onCreate suivante:

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

Aucune de ces solutions n'a fonctionné pour moi. La façon dont je corrige l'autofocus était:

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

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

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

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.


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

Essayez clearFocus() au lieu de setSelected(false) . Chaque vue dans Android possède à la fois la focalisation et la sélection, et je pense que vous souhaitez simplement clarifier la mise au point.


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

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

Je devais effacer le focus de tous les domaines par programmation. Je viens d'ajouter les deux déclarations suivantes à la définition de ma 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 pour m'avoir orienté dans la bonne direction.


La chose la plus simple que j'ai faite est de mettre l'accent sur une autre vue dans onCreate:

    myView.setFocusableInTouchMode(true);
    myView.requestFocus();

Cela a empêché le clavier logiciel d'apparaître et il n'y avait aucun curseur clignotant dans EditText.


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 n'aura pas le focus après le démarrage de l'activité


Le problème actuel est-il que vous ne voulez pas qu'il soit concentré du tout? Ou vous ne voulez pas que le clavier virtuel EditText suite à la focalisation de la commande EditText ? Je ne vois pas vraiment d' EditText ce que EditText concentre sur le démarrage, mais le fait que la fenêtre softInput soit ouverte lorsque l'utilisateur n'a pas explicitement demandé à se focaliser sur le EditText (et ouvre le clavier en conséquence) est certainement un problème.

S'il s'agit du problème du clavier virtuel, consultez la documentation de l' élément AndroidManifest.xml <activity> .

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

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


Oui, j'ai fait la même chose: créer une mise en page linéaire factice qui obtienne le focus initial. De plus, j'ai défini les identifiants de focus suivants pour que l'utilisateur ne puisse plus le focaliser après un défilement initial:

<LinearLayout 'dummy'>
<EditText et>

dummy.setNextFocusDownId(et.getId());

dummy.setNextFocusUpId(et.getId());

et.setNextFocusUpId(et.getId());

beaucoup de travail juste pour se débarrasser de l'accent sur une vue ..

Merci


Pour moi, ce qui a fonctionné sur tous les appareils est le suivant:

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

Il suffit de mettre cela comme une vue avant la vue problématique, et c'est tout.


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

android:windowSoftInputMode="stateAlwaysHidden"

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

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


Vous pouvez y parvenir en créant un EditText factice avec une largeur et une hauteur de mise en 0dp définies sur 0dp et en demandant le focus à cette vue. Ajoutez l'extrait de code suivant dans votre mise en page XML:

<EditText
    android:id="@+id/editText0"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:hint="@string/dummy"
    android:ems="10" 
    >
     <requestFocus />
    </EditText>




android-edittext