web-dev-qa-db-fra.com

Android: Forcer EditText à supprimer le focus?

J'aimerais pouvoir supprimer le focus de EditText. Par exemple, si le clavier apparaît et que l'utilisateur le cache avec le bouton Précédent, je souhaite que le focus et le curseur disparaissent. Comment ceci peut être fait?

326
Alex1987

Vous pouvez ajouter ceci à onCreate et il cachera le clavier à chaque démarrage de l'activité.

Vous pouvez également modifier le focus par programme sur un autre élément.

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

Vous pouvez faire disparaître le curseur et la mise au point par

edittext.clearFocus();

Mais détecter quand le clavier se cacher est un travail difficile.

311
xtr

Ajoutez LinearLayout avant EditText dans votre fichier XML.

<LinearLayout 
    Android:focusable="true"
    Android:focusableInTouchMode="true" 
    Android:clickable="true"
    Android:layout_width="0px"
    Android:layout_height="0px" />

Ou vous pouvez faire la même chose en ajoutant ces lignes à afficher avant votre 'EditText'.

<Button
    Android:id="@+id/btnSearch"
    Android:layout_width="50dp"
    Android:layout_height="50dp"
    Android:focusable="true"
    Android:focusableInTouchMode="true"
    Android:gravity="center"
    Android:text="Quick Search"
    Android:textColor="#fff"
    Android:textSize="13sp"
    Android:textStyle="bold" />

<EditText
    Android:id="@+id/edtSearch"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignParentLeft="true"
    Android:layout_centerVertical="true"
    Android:layout_marginRight="5dp"
    Android:gravity="left"
    Android:hint="Name"
    Android:maxLines="1"
    Android:singleLine="true"
    Android:textColorHint="@color/blue"
    Android:textSize="13sp"
    Android:textStyle="bold" />
145
Singh Arjun

Supprimer le focus mais rester focalisable:

editText.setFocusableInTouchMode(false);
editText.setFocusable(false);
editText.setFocusableInTouchMode(true);
editText.setFocusable(true);

EditText perd le focus, mais peut le gagner à nouveau lors d'un nouvel événement tactile.

89
Paschalis

supprimer l'autofocus edittext Android

Ça marche pour moi

Modifier Dans le lien proposé, ils suggèrent d'utiliser LinearLayout, mais une vue simple fonctionnera

<View
    Android:id="@+id/focus_thief"
    Android:layout_width="1dp"
    Android:layout_height="1dp"
    Android:focusable="true"
    Android:focusableInTouchMode="true" />

Ensuite, si ce "voleur" est placé en haut de la présentation (pour être le premier élément activable), les appels à clearFocus() fonctionneront.

68
sondt87

Ajoutez ces deux propriétés à votre mise en page parent (ex: mise en page linéaire, mise en page relative)

Android:focusable="true"
Android:focusableInTouchMode="true" 

Ça va faire l'affaire :)

51
King of Masses

Vous pouvez également inclure Android: windowSoftInputMode = "stateAlwaysHidden" dans votre section d'action manifeste.

Ceci est équivalent à:

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

mais de manière XML.

Pour votre information, vous pouvez également masquer le clavier avec des codes:

// hide virtual keyboard
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mYourEditText.getWindowToken(), 0);
30
Jarod DY Law

essayez d'utiliser celui-ci à votre avis, cela a fonctionné pour moi:

<View
    Android:id="@+id/fucused"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:focusable="true"
    Android:focusableInTouchMode="true"/>
20
ediBersh

vous devez enlever <requestFocus/>

si vous ne l'utilisez pas et toujours le même problème

utilisateur LinearLayout en tant que parent et défini

Android:focusable="true"
Android:focusableInTouchMode="true"

J'espère que ça vous aidera.

18
Mohamed Hussien

Pour masquer le clavier au démarrage de l'activité, écrivez le code suivant dans onCreate () ..

InputMethodManager imm = (InputMethodManager)
getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getWindow().getDecorView().getWindowToken(), 0);

Pour effacer le focus et supprimer le curseur de edittext .....

editText.clearFocus();

editText.setCursorVisible(false);
17
Pratibha Sarode

Ajoutez à votre mise en page parent où avez-vous mis votre EditText this Android:focusableInTouchMode="true"

17
Context

Ceci est ma toute première réponse sur SO, alors ne soyez pas trop sévère avec moi s'il y a des erreurs. :RÉ

Il y a peu de réponses qui circulent autour du SO, mais je sens l'envie de publier ma solution complète car cela m'a rendu fou. J'ai attrapé des morceaux de partout, alors pardonnez-moi si je ne donne pas de crédits respectifs à tout le monde ... :)

(Je simplifierai mon résultat car mon point de vue contient trop d'éléments et je ne veux pas du spam avec ça et je vais essayer de le rendre aussi générique que possible ...)

Pour votre mise en page, vous avez besoin d'un parent votre EditText et parent vue défini quelque chose comme ceci:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android" 
              Android:orientation="vertical"
              Android:layout_width="match_parent" 
              Android:layout_height="match_parent"
              Android:id="@+id/lytContainer"
              Android:descendantFocusability="beforeDescendants"
              Android:focusableInTouchMode="true">
<EditText Android:layout_width="fill_parent" 
              Android:layout_height="wrap_content" 
              Android:id="@+id/etEditor"
              Android:inputType="number"
              Android:layout_gravity="center" 
              Android:hint="@string/enter_your_text"
              Android:textColor="@Android:color/darker_gray" 
              Android:textSize="12dp"
              Android:textAlignment="center" 
              Android:gravity="center" 
              Android:clickable="true"/>
</LinearLayout>

Donc, j'avais besoin de quelques choses ici. Je devais avoir un espace réservé pour mon EditText - qui est-ce -

Android: indice = "indice"

Aussi,

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

fait en sorte que EditText ne soit pas concentré sur l'entrée Activity et plus tard dans Activity lui-même lorsque vous le définissez, ce paramètre vous permet de définir onTouchListener sur celui-ci de manière à dérober le focus EditText .

Maintenant, dans l'activité:

package com.at.keyboardhide;

import Android.app.Activity;
import Android.content.Context;
import Android.os.Bundle;
import Android.view.MotionEvent;
import Android.view.View;
import Android.view.WindowManager;
import Android.view.View.OnTouchListener;
import Android.view.inputmethod.InputMethodManager;
import Android.widget.EditText;
import Android.widget.LinearLayout;

public class MainActivity extends Activity implements OnTouchListener{
private EditText getEditText;
private LinearLayout getLinearLayout;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

    setContentView(R.layout.keyboardmain);
    getEditText = (EditText)findViewById(R.id.etEditor);
    getLinearLayout = (LinearLayout)findViewById(R.id.lytContainer);
    getLinearLayout.setOnTouchListener(this);

    getEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_DONE) {
                Log.d("EDTA", "text was entered.");
                getEditText.clearFocus();
                imm.hideSoftInputFromWindow(barcodeNo.getWindowToken(), 0);
                return true;
            }
            return false;
        }
    });
}
@Override
public boolean onTouch(View v, MotionEvent event) {
    if(v==getLinearLayout){
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        imm.hideSoftInputFromWindow(getEditText.getWindowToken(), 0);
        getEditText.clearFocus();
        return true;
        }
    return false;
    }
}

Peu de réponses pour les bits que j'ai trouvés sur cette page de question, et la partie avec la solution d'activité que j'ai trouvée sur ce blog . Le reste qui me manquait et que je devais comprendre moi-même, c’était éclaircir le focus sur le EditText que j’ai ajouté aux deux dans le setOnEditorActionListener et onTouchLister pour la vue parent .

J'espère que cela aide quelqu'un et lui fait gagner du temps. :)

À la vôtre, Z.

10
zed

Dans les commentaires, vous avez demandé si une autre vue pouvait être utilisée au lieu de EditText. Oui il peut. Utilisez la méthode .requestFocus() pour la vue que vous souhaitez mettre en évidence au début (dans la méthode onCreate ())

Si vous vous concentrez sur une autre vue, vous couperez du code. (code pour cacher le clavier par exemple)

6
Nikola Despotoski

J'ai eu le même problème. Cela m'a rendu plus que fou.

J'avais un dialogue étendu avec une ScrollView qui avait un TableLayout avec un LinearLayout étendu qui contenait un SeekBar et un EditText.

Le premier EditText avait toujours l'autofocus après avoir montré la boîte de dialogue et une fois l'édition du texte terminée au clavier, EditText avait toujours le focus et le clavier était toujours visible.

J'ai essayé presque toutes les solutions de ce fil et aucune n'a fonctionné pour moi.

Alors voici mon solution simple: (text = EditText)

text.setOnEditorActionListener( new OnEditorActionListener( ){
    public boolean onEditorAction( TextView v, int actionId, KeyEvent event ){
        if( (event != null && event.getKeyCode() == KeyEvent.KEYCODE_ENTER) ||
            (actionId == EditorInfo.IME_ACTION_DONE) ){
            text.clearFocus( );
            InputMethodManager iMgr = null;
            iMgr = (InputMethodManager)mContext.getSystemService( Context.INPUT_METHOD_SERVICE );
            iMgr.hideSoftInputFromWindow( text.getWindowToken(), 0 );
        }
        return true;
    }
});

À propos, j'ai non utilisé l'un des extraits suivants pour le résoudre:

//setFocusableInTouchMode( true )
//setFocusable( true )
//setDescendantFocusability( ViewGroup.FOCUS_BEFORE_DESCENDANTS )

AND I non a utilisé un élément d'espacement tel qu'une vue avec une largeur et une hauteur de 1dp.

Espérons que cela aide quelqu'un: D

4
Pixtar

Vous pouvez également inclure Android:windowSoftInputMode="stateAlwaysHidden" dans votre section d'action manifeste.

Ceci est équivalent à:

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
3
user2471325
editText.setFocusableInTouchMode(true)

Le EditText pourra obtenir le focus lorsque l'utilisateur le touchera. Lorsque la disposition principale (activité, boîte de dialogue, etc.) devient visible, la EditText ne reçoit pas automatiquement le focus, même s'il s'agit de la première vue de la disposition.

2
Fabio Mitrano
EditText.setOnKeyListener(new OnKeyListener() {
            public boolean onKey(View view, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_ENTER) {
                    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(URLText.getWindowToken(), 0); 
                    EditText.setFocusable(false);
                    EditText.setFocusableInTouchMode(true);
                    return true;
                } else {
                    return false;
                }
            }
        });
2
Abhi

Vous pouvez éviter toute focalisation sur vos éléments en définissant l'attribut Android: descendantFocusability de l'élément parent.

Voici un exemple:

<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:id="@+id/search__scroller"
Android:descendantFocusability="blocksDescendants"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:layout_alignParentLeft="true"
Android:layout_alignParentTop="true" >
</ScrollView>

Ici, l'attribut Android: descendantFocusability défini sur "blocksDescendants" bloque le focus sur les éléments enfants.

Vous pouvez trouver plus d'informations ici .

0
podpo