web-dev-qa-db-fra.com

Comment rendre EditText non ciblé lors de la création d'une activité

Avant de voter et de marquer comme doublon, lisez ma question.

J'ai lu les autres questions à ce sujet et toutes fonctionnent pour mes mises en page, sauf pour la toute première créée.

Pour le moment, cela se trouve au sommet de ma méthode onCreate:

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

^ Cela fait qu'au moins le clavier n'apparaisse pas au démarrage, mais la variable EditText est toujours active.

Ceci est la XML pour ma EditText:

<EditText
    Android:id="@+id/password"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_below="@+id/changePass"
    Android:layout_centerHorizontal="true"
    Android:layout_marginTop="167dp"
    Android:ems="10"
    Android:imeOptions="flagNoExtractUi"
    Android:inputType="textPassword"
    Android:maxLength="30" >
</EditText>

Voici à quoi ça ressemble quand je lance mon activité:

enter image description here

Le problème est que, avec certains téléphones, lorsqu'un EditText est concentré de la sorte, ils ne peuvent pas y écrire. Je le veux pas concentre.

Ce que j'ai fait fonctionne pour les prochaines mises en page, dans le sens où la EditTexts n'est pas centrée sur et ressemblerait davantage à ceci:

enter image description here

Notez que c'est la même disposition, cependant. Ceci est l'écran après que l'utilisateur a été ramené à cet écran, ce qui indiquerait que rien ne va pas avec XML car c'est le même XML, mais le problème est que la EditText est uniquement centrée sur lorsque l'activité est créée.

J'ai fait des recherches et toutes les autres questions ne m'aident pas (ils ont toutefois aidé le clavier à ne pas apparaître, heureusement). Comment puis-je faire en sorte que la variable EditText au démarrage ressemble à la deuxième capture d'écran plutôt qu'à la première?

63
Michael Yaworski

Vous pouvez définir les propriétés de Layout comme Android:descendantFocusability="beforeDescendants" et Android:focusableInTouchMode="true" 

Exemple:

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

    <EditText
        Android:id="@+id/password"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_below="@+id/changePass"
        Android:layout_centerHorizontal="true"
        Android:layout_marginTop="167dp"
        Android:ems="10"
        Android:imeOptions="flagNoExtractUi"
        Android:inputType="textPassword"
        Android:maxLength="30" >
    </EditText>

</RelativeLayout>

Que celui-ci soit utile;)

280
Pratik Butani

Code XML:

<EditText
    Android:id="@+id/password"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_below="@+id/changePass"
    Android:layout_centerHorizontal="true"
    Android:layout_marginTop="167dp"
    Android:ems="10"
    Android:focusable="false"
    Android:imeOptions="flagNoExtractUi"
    Android:inputType="textPassword"
    Android:maxLength="30" >
</EditText>

Code Java:

EditText edPwd = (EditText)findViewById(R.id.password);
edtPwd.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {

            v.setFocusable(true);
            v.setFocusableInTouchMode(true);
            return false;
        }
    });

définissez false comme focusable en xml et définissez-le sur true via le code

16
Meher

Dans votre main_layout Ajoutez ces 2 lignes:

Android:descendantFocusability="beforeDescendants"
Android:focusableInTouchMode="true"

exemple:

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:descendantFocusability="beforeDescendants"
Android:focusableInTouchMode="true"> *YOUR LAYOUT CODE* </RelativeLayout>
12
avisper

Ajouter ceci dans onCreate () 

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

ou dans onCreateView ()

 getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
2
Sanket Parchande

Code XML

<EditText 
    Android:imeOptions="flagNoExtractUi"
    Android:focusable="false"
    />

Code Java dans onClickListerner

 mEdtEnterPhoneNumber.setFocusable(true);
    mEdtEnterPhoneNumber.setFocusableInTouchMode(true);
1
Hai Rom

la meilleure solution est ici: https://stackoverflow.com/a/45139132/3172843

la solution correct et simple consiste à définirFocusable false et setFocusableInTouchMode true. de sorte que EditText gagne le focus uniquement lorsque l'utilisateur touche cet EditText

Android:focusable="false"
Android:focusableInTouchMode="true"
1
faraz khonsari

Le plus simple est d’ajouter 

Android:windowSoftInputMode="stateAlwaysHidden|adjustPan" 

dans la balise d'activité du fichier Manifest.xml

0
Sudhir singh

Il est possible d'utiliser Android:focusable="false" pour le désactiver, mais si cela ne fonctionne pas pour une raison quelconque, vous pouvez simplement mettre une LinearLayout et le focus sera activé sans perturber votre mise en page. 

REMARQUE: Eclipse vous indiquera une erreur en vous disant que votre LinearLayout est inutile car elle n’a aucun contenu. Vous devriez pouvoir l'ignorer sans problèmes.

Par exemple:

<LinearLayout
    Android:focusable="true"
    Android:focusableInTouchMode="false"
    Android:layout_width="0dp"
    Android:layout_height="0dp"
    />
<EditText
    Android:id="@+id/password"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_below="@+id/changePass"
    Android:layout_centerHorizontal="true"
    Android:layout_marginTop="167dp"
    Android:ems="10"
    Android:imeOptions="flagNoExtractUi"
    Android:inputType="textPassword"
    Android:maxLength="30" >
</EditText>
</LinearLayout>
0
ThatGuyThere
<activity
            Android:name=".MainActivity"
            Android:windowSoftInputMode="stateAlwaysHidden" />

Android: windowSoftInputMode = "stateAlwaysHidden"

ajoutez cette ligne dans la balise d'activité du fichier Manifest.xml. Lorsque vous cliquez sur TextEdit, le clavier devient actif. 

0
pruthwiraj.kadam

Dans Manifest, copiez et collez le code ci-dessous.

 <activity
   Android:name=".LoginActivity"
   Android:windowSoftInputMode="stateAlwaysHidden"/>
0
Agilanbu

1) C'est la plus simple, ouvrez le manifeste et mettez le code suivant entre les balises d'activité:

Android:windowSoftInputMode="stateHidden"

2) Mettez ces attributs dans la mise en page parent

Android:focusable="true" 
Android:focusableInTouchMode="true"
0
Vincent Mungai

Vous pouvez le faire par programme. utilisez editText.setEnabled(false) dans votre méthode onStart() de votre activité (pas dans onCreate () - car il s'agit d'une méthode d'initialisation des composants de l'interface graphique)

0
Nicole Conrad