Android: forcer EditText à supprimer focus? [dupliquer]

cette question a déjà une réponse ici:

  • Stop EditText de gagner de l'accent à l'Activité de démarrage 46 réponses

je voudrais pouvoir supprimer le focus de L'EditText. Par exemple, si le Clavier s'affiche et l'utilisateur cache avec le bouton de retour, je voudrais l'accent et le curseur à disparaître. Comment peut-il être fait?

262
demandé sur Alex1987 2011-02-20 14:29:34

19 réponses

vous pouvez ajouter cela à onCreate et il cachera le clavier chaque fois que l'activty commence.

vous pouvez également programmatically changer le foyer à un autre élément.

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
214
répondu Wayner 2016-07-18 14:09:03

Vous pouvez faire de curseur et de se concentrer disparaître par

edittext.clearFocus();

mais détecter quand le cache de carte est un travail difficile.

273
répondu xtr 2011-05-25 05:59:01

ajouter LinearLayout avant EditText dans votre 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 à view 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" />
120
répondu Singh Arjun 2018-06-15 09:23:22

Supprimer focus mais rester focalisable:

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

EditText perdra la mise au point, mais pourra la gagner à nouveau sur un nouvel événement tactile.

76
répondu Paschalis 2017-01-13 19:18:45

remove autofocus edittext android

ça marche pour moi

Edit dans le lien qu'ils suggèrent d'utiliser LinearLayout, mais simple View will work

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

alors si ce" voleur "est placé en haut de la mise en page (pour être le premier élément focalisable) les appels à clearFocus() fonctionneront.

59
répondu sondt87 2014-10-14 12:53:02

ajouter ces deux propriétés à votre disposition mère (ex: Layout linéaire, Layout relatif)

android:focusable="true"
android:focusableInTouchMode="true" 

Il va faire le tour :)

43
répondu King of Masses 2015-05-14 05:39:00

vous pouvez également inclure android:windowSoftInputMode=" statewayshidden " dans votre section d'action manifeste.

équivalent à:

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

mais de manière XML.

POUR INFO, vous pouvez aussi cacher le clavier avec les codes:

// hide virtual keyboard
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mYourEditText.getWindowToken(), 0);
29
répondu Jarod DY Law 2012-08-26 22:55:15

vous devez supprimer <requestFocus/>

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

utilisateur LinearLayout en tant que parent et réglez

android:focusable="true"
android:focusableInTouchMode="true"

J'espère que ça vous aidera.

15
répondu Mohamed Hussien 2015-02-14 12:51:44

essayez d'utiliser celui-ci sur votre vue 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"/>
15
répondu ediBersh 2017-01-20 23:29:45

ajoutez à votre mise en page mère où Avez-vous mis votre EditText ce android:focusableInTouchMode="true"

11
répondu Context 2015-10-29 08:58:39

pour cacher le clavier quand l'activité commence.. Ecrire le code suivant dans onCreate()..

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

pour clarifier la mise au point et supprimer le curseur d'edittext.....

editText.clearFocus();

editText.setCursorVisible(false);
11
répondu Pratibha Sarode 2015-11-17 12:12:54

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

il y a peu de réponses qui flottent autour du SO, mais je sens l'envie de poster ma solution complète car cela m'a rendu fou. J'ai pris des bouts et des morceaux de tout autour donc pardonnez-moi si Je ne donne pas les crédits respectifs à tout le monde... :)

(je vais simplifier mon résultat parce que mon point de vue a trop d'éléments et je ne veux pas spam avec cela et essaiera pour le rendre aussi générique que possible...)

pour votre mise en page vous avez besoin d'un parent votre EditText et vue de parent 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 trucs ici. J'avais besoin d'avoir un Placeholder pour mon EditText - qui est cela -

android:hint="astuce"

Aussi,

android:descendantFocusability="beforeDescendants"
android:focusableInTouchMode="true"

fait pour EditText de ne pas être porté sur la saisie de la Activité et plus tard dans le Activité lui-même lorsque le réglage de ce paramètre permet de sorte que vous pouvez définir onTouchListener pour voler de l'accent mis sur 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é sur cette page de questions, et la partie avec la solution D'activité que j'ai trouvé sur ce blog . Le reste que j'ai manqué que j'ai dû comprendre moi-même était clair focus sur le EditText que j'ai ajouté à la fois à l'intérieur du setOnEditorActionListener et onTouchLister pour le parent view .

Espérons que cela aide quelqu'un et enregistre leur temps. :)

santé, Z.

9
répondu zed 2014-03-18 13:11:27

dans les commentaires vous avez demandé si une autre vue peut être focalisée au lieu du texte D'édition. Oui, il peut. Utiliser .requestFocus() méthode pour la vue que vous voulez être porté au début (dans onCreate ())

également focalisation autre vue découpera une certaine quantité de code. (code pour cacher le clavier par exemple)

6
répondu Nikola Despotoski 2011-07-26 15:49:47

vous pouvez aussi inclure android:windowSoftInputMode="stateAlwaysHidden" dans votre section manifeste.

équivalent à:

this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
3
répondu 2015-03-04 06:20:11

j'ai eu le même problème. Elle m'a fait le plus de fou.

j'ai eu un dialogue étendu avec un ScrollView qui avait un TableLayout avec un LinearLayout étendu qui contenait une SeekBar et un EditText.

le premier texte édité avait toujours l'autofocus après avoir montré le dialogue et après avoir édité le texte sur le clavier le texte édité avait toujours le focus et le clavier était encore visible.

j'ai essayé presque toutes les solutions de ce fil et aucun 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;
    }
});

d'ailleurs, I n'a pas utilisé l'un des snippets suivants pour le résoudre:

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

ET je ne utilisé une entretoise élément comme une Vue avec la largeur et la hauteur de 1dp.

Espérons que cela aide quelqu'un :D

3
répondu Pixtar 2015-08-21 11:49:21
editText.setFocusableInTouchMode(true)

Le EditText sera en mesure d'obtenir le focus lorsque l'utilisateur touche. Lorsque la page principale (activité, dialogue, etc.) devient visible le EditText n'obtient pas automatiquement la mise au point même s'il s'agit de la première vue dans la mise en page.

2
répondu Fabio Mitrano 2014-10-20 15:20:11
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
répondu Abhi 2015-07-21 14:56:00

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 à" blocksDescendants " bloque l'attention sur les éléments enfants.

vous pouvez trouver plus d'informations ici .

0
répondu podpo 2013-07-13 02:59:37
check your xml file
 <EditText
            android:id="@+id/editText1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="14sp" >

            **<requestFocus />**
 </EditText>


//Remove  **<requestFocus />** from xml
-4
répondu SuSh 2013-02-07 12:23:32