web-dev-qa-db-fra.com

Comment désactiver le menu contextuel du clavier lorsque vous êtes sur edittext?

Dans mon application, la première vue de tous mes écrans est un EditText. Ainsi, chaque fois que je vais sur un écran, le clavier à l'écran apparaît. Comment puis-je désactiver cette fenêtre et l'activer lorsque vous cliquez manuellement sur EditText ????

    eT = (EditText) findViewById(R.id.searchAutoCompleteTextView_feed);

    eT.setOnFocusChangeListener(new OnFocusChangeListener() {

        public void onFocusChange(View v, boolean hasFocus) {

            if(hasFocus){
            InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
            imm.hideSoftInputFromWindow(eT.getWindowToken(), 0);
            }
        }
    });

code xml:

<ImageView
    Android:id="@+id/feedPageLogo"
    Android:layout_width="45dp"
    Android:layout_height="45dp"
    Android:src="@drawable/wic_logo_small" />

<Button
    Android:id="@+id/goButton_feed"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_alignParentRight="true"
    Android:text="@string/go" />

<EditText
    Android:id="@+id/searchAutoCompleteTextView_feed"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_toLeftOf="@id/goButton_feed"
    Android:layout_toRightOf="@id/feedPageLogo"
    Android:hint="@string/search" />

<TextView
    Android:id="@+id/feedLabel"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_below="@id/feedPageLogo"
    Android:gravity="center_vertical|center_horizontal"
    Android:text="@string/feed"
    Android:textColor="@color/white" />

<LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/ButtonsLayout_feed"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_alignParentBottom="true" >

    <Button
        Android:id="@+id/feedButton_feed"
        Android:layout_width="wrap_content"
        Android:layout_height="30dp"
        Android:layout_margin="0dp"
        Android:layout_weight="1"
        Android:background="@color/white"
        Android:text="@string/feed"
        Android:textColor="@color/black" />

    <Button
        Android:id="@+id/iWantButton_feed"
        Android:layout_width="wrap_content"
        Android:layout_height="30dp"
        Android:layout_margin="0dp"
        Android:layout_weight="1"
        Android:background="@color/white"
        Android:text="@string/iwant"
        Android:textColor="@color/black" />

    <Button
        Android:id="@+id/shareButton_feed"
        Android:layout_width="wrap_content"
        Android:layout_height="30dp"
        Android:layout_margin="0dp"
        Android:layout_weight="1"
        Android:background="@color/white"
        Android:text="@string/share"
        Android:textColor="@color/black" />

    <Button
        Android:id="@+id/profileButton_feed"
        Android:layout_width="wrap_content"
        Android:layout_height="30dp"
        Android:layout_margin="0dp"
        Android:layout_weight="1"
        Android:background="@color/white"
        Android:text="@string/profile"
        Android:textColor="@color/black" />
</LinearLayout>

<ListView
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:id="@+id/feedListView"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_above="@id/ButtonsLayout_feed"
    Android:layout_below="@id/feedLabel"
    Android:textSize="15dp" >
</ListView>

la troisième vue (EditText) est l'endroit où le focus est.

81
Housefly

La meilleure solution réside dans le fichier Project Manifest (AndroidManifest.xml), ajoutez l'attribut suivant dans la construction activity.

Android: windowSoftInputMode = "stateHidden"


Exemple:

    <activity Android:name=".MainActivity" 
              Android:windowSoftInputMode="stateHidden" />

La description: 

  • L'état du clavier tactile, qu'il soit masqué ou visible, lorsque l'activité est au centre de l'attention de l'utilisateur.
  • L'ajustement apporté à la fenêtre principale de l'activité - si celle-ci est redimensionnée pour laisser de la place au clavier logiciel ou si son contenu est panoramique pour rendre le focus actuel visible lorsqu'une partie de la fenêtre est recouverte par le clavier logiciel.

Introduit dans: 

  • Niveau API 3.

Lien vers les documents

Remarque:Les valeurs définies ici (autres que "stateUnspecified" et "adjustUnspecified") remplacent les valeurs définies dans le thème.

166
Skynet

Vous devez créer une vue, au-dessus de EditText, qui prend un "faux" focus:

Quelque chose comme :

<!-- Stop auto focussing the EditText -->
<LinearLayout
    Android:layout_width="0dp"
    Android:layout_height="0dp"
    Android:background="@Android:color/transparent"
    Android:focusable="true"
    Android:focusableInTouchMode="true">
</LinearLayout>

<EditText
    Android:id="@+id/searchAutoCompleteTextView_feed"
    Android:layout_width="200dp"
    Android:layout_height="wrap_content"
    Android:inputType="text" />

Dans ce cas, j'ai utilisé LinearLayout pour demander le focus. J'espère que cela t'aides.

Cela a fonctionné parfaitement ... grâce à Zaggo0

80
Housefly
     edittext.setShowSoftInputOnFocus(false);

Vous pouvez maintenant utiliser n'importe quel clavier personnalisé.

32
Matthew556

Ajoutez le code ci-dessous sur votre classe d'activité.

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

Le clavier apparaît lorsque l'utilisateur clique sur le texte d'édition

20
Sonia John Kavery

Les gens ont suggéré de nombreuses solutions intéressantes ici, mais j’utilisais cette technique simple avec mon EditText (rien dans Java et AnroidManifest.xml n’est requis). Il suffit de définir votre focusable et focusableInTouchMode sur false directement sur EditText.

 <EditText
        Android:id="@+id/text_pin"
        Android:layout_width="136dp"
        Android:layout_height="wrap_content"
        Android:layout_margin="5dp"
        Android:textAlignment="center"
        Android:inputType="numberPassword"
        Android:password="true"
        Android:textSize="24dp"
        Android:focusable="false"
        Android:focusableInTouchMode="false"/>

Mon intention ici est d’utiliser cette zone de saisie dans l’activité de verrouillage de l’application où je demande à l’utilisateur de saisir le PIN et de montrer mon clavier personnalisé PIN. Testé avec minSdk = 8 et maxSdk = 23 sur Android Studio 2.1

 enter image description here

17
A.B.

Vous pouvez utiliser le code suivant pour désactiver le clavier à l'écran.

InputMethodManager im = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(editText.getWindowToken(), 0);
9
Lucifer

Deux solutions simples:

La première solutionest ajoutée sous la ligne de code dans le fichier xml manifeste . Dans le fichier manifeste (AndroidManifest.xml), ajoutez l'attribut suivant dans la construction d'activité.

Android: windowSoftInputMode = "stateHidden"

Exemple:

<activity Android:name=".MainActivity" 
          Android:windowSoftInputMode="stateHidden" />

Deuxième solution ajoute la ligne de code ci-dessous dans l'activité

//Block auto opening keyboard  
  this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

Nous pouvons utiliser l'une des solutions ci-dessus. Merci

7
kgsharathkumar

Déclarez la variable globale pour InputMethodManager:

 private InputMethodManager im ;

Sous onCreate (), définissez-le:

 im = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
 im.hideSoftInputFromWindow(youredittext.getWindowToken(), 0);

Définissez onClickListener sur ce texte édité dans oncreate ():

 youredittext.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        im.showSoftInput(youredittext, InputMethodManager.SHOW_IMPLICIT);
    }
});

Cela fonctionnera.

5
AndroGeek

essayez-le ....... je résous ce problème en utilisant le code: -

EditText inputArea;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
inputArea = (EditText) findViewById(R.id.inputArea);

//This line is you answer.Its unable your click ability in this Edit Text
//just write
inputArea.setInputType(0);
}

rien ne peut entrer par défaut sur la calculatrice, mais vous pouvez définir une chaîne.

l'essayer

4
S.M.Fazle Rabbi

Utilisez le code suivant, écrivez-le sous onCreate()

InputMethodManager inputManager = (InputMethodManager)
                                   getSystemService(Context.INPUT_METHOD_SERVICE); 
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
                                   InputMethodManager.HIDE_NOT_ALWAYS);         
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
4
Dharmaraj Patil

Eh bien, j'ai le même problème et je viens de m'attaquer à focusable dans le fichier XML.

<EditText
            Android:cursorVisible="false"
            Android:id="@+id/edit"
            Android:focusable="false"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content" />

Vous recherchez probablement aussi la sécurité. Cela aidera à cela aussi.

2
Divyansh

Merci @ A.B pour une bonne solution

    Android:focusableInTouchMode="false"

dans ce cas, si vous souhaitez désactiver le clavier dans le texte modifié, ajoutez simplement Android: focusableInTouchMode = "false" in tagline edittext.

travailler pour moi dans Android Studio 3.0.1 minsdk 16, maxsdk26

2
NZXT

Essayez avec ceci:

EditText yourEditText= (EditText) findViewById(R.id.yourEditText); 
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.showSoftInput(yourEditText, InputMethodManager.SHOW_IMPLICIT); 

Pour fermer, vous pouvez utiliser: 

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
 imm.hideSoftInputFromWindow(yourEditText.getWindowToken(), 0); 

Essayez comme ça dans votre code:

ed = (EditText)findViewById(R.id.editText1);

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);  
imm.hideSoftInputFromWindow(ed.getWindowToken(), 0);  

ed.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {
        InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);  
        imm.showSoftInput(ed, InputMethodManager.SHOW_IMPLICIT);  
    }
});
2
user1213202

Utilisez le code suivant dans votre méthode onCreate()-

    editText = (EditText) findViewById(R.id.editText);
    editText.requestFocus();
    editText.postDelayed(new Runnable() {
        public void run() {
            InputMethodManager keyboard = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
            keyboard.hideSoftInputFromWindow(
                    editText.getWindowToken(), 0);
        }
    }, 200);
1
Priyanka

Si vous utilisez Xamarinvous pouvez ajouter ceci

Activity[(WindowSoftInputMode = SoftInput.StateAlwaysHidden)]

ensuite, vous pouvez ajouter cette ligne dans la méthode OnCreate ().

youredittext.ShowSoftInputOnFocus = false;

Si le périphérique ciblé ne prend pas en charge le code ci-dessus, vous pouvez utiliser le code ci-dessous dans l'événement de clic EditText.

InputMethodManager Imm = (InputMethodManager)this.GetSystemService(Context.InputMethodService);
Imm.HideSoftInputFromWindow(youredittext.WindowToken, HideSoftInputFlags.None);
1
Ashish Sinha

La seule chose que vous devez faire est d’ajouter Android:focusableInTouchMode="false" à EditText au format XML et c’est tout (si quelqu'un a encore besoin de savoir comment le faire facilement).

1
GoldFish

J'ai trouvé que le modèle suivant fonctionnait bien pour moi dans le code où je voulais afficher une boîte de dialogue pour obtenir l'entrée (par exemple, la chaîne affichée dans le champ de texte est le résultat de sélections effectuées dans une liste de cases à cocher d'une boîte de dialogue plutôt texte saisi via le clavier). 

  1. Désactiver la mise au point d'entrée douce sur le champ d'édition. Je ne peux pas désactiver l'activité complète, car il existe des champs de saisie pour lesquels le clavier doit être utilisé dans la même présentation.
  2. Les premiers clics dans le champ de texte entraînent un changement de focus, un clic répété génère un événement de clic. Donc, je remplace les deux (ici, je ne refactorise pas le code pour illustrer que les deux gestionnaires font la même chose):

    tx = (TextView) m_activity.findViewById(R.id.allergymeds);
    if (tx != null) {
        tx.setShowSoftInputOnFocus(false);
        tx.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View view, boolean hasFocus) {
                if (hasFocus) {
                    MedicationsListDialogFragment mld = new MedicationsListDialogFragment();
                    mld.setPatientId(m_sess.getActivePatientId());
                    mld.show(getFragmentManager(), "Allergy Medications Dialog");
                }
            }
        });
        tx.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                MedicationsListDialogFragment mld = new MedicationsListDialogFragment();
                mld.setPatientId(m_sess.getActivePatientId());
                mld.show(getFragmentManager(), "Allergy Medications Dialog");
            }
        });
    }
    
1
slogan621

Pour les utilisateurs de Xamarin:

[Activity(MainLauncher = true, 
        ScreenOrientation = ScreenOrientation.Portrait, 
        WindowSoftInputMode = SoftInput.StateHidden)] //SoftInput.StateHidden - disables keyboard autopop
1
Roy Doron

Essayez cette réponse, 

editText.setRawInputType(InputType.TYPE_CLASS_TEXT);
editText.setTextIsSelectable(true);

Remarque: uniquement pour API 11+

0
Ranjith Kumar

Dans une application Android que je construisais, j'avais trois EditTexts dans un LinearLayout disposés horizontalement. J'ai dû empêcher le clavier logiciel d'apparaître lorsque le fragment était chargé. En plus de définir focusable et focusableInTouchMode sur true sur LinearLayout, j'ai dû définir descendantFocusability sur blocksDescendants. Dans onCreate, j'ai appelé requestFocus sur le LinearLayout. Cela empêchait le clavier d'apparaître lors de la création du fragment. 

Disposition - 

    <LinearLayout
       Android:id="@+id/text_selector_container"
       Android:layout_width="match_parent"
       Android:layout_height="wrap_content"
       Android:weightSum="3"
       Android:orientation="horizontal"
       Android:focusable="true"
       Android:focusableInTouchMode="true"
       Android:descendantFocusability="blocksDescendants"
       Android:background="@color/black">

       <!-- EditText widgets -->

    </LinearLayout>

Dans onCreate - mTextSelectorContainer.requestFocus();

0
indyfromoz
       <TextView Android:layout_width="match_parent"
                 Android:layout_height="wrap_content"

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

                <requestFocus/>
      </TextView>

      <EditText Android:layout_width="match_parent"
                Android:layout_height="wrap_content"/>
0
NickUnuchek

Utilisez ceci pour activer et désactiver EditText ....

InputMethodManager imm;

imm = (InputMethodManager)
getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);

if (isETEnable == true) {

    imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, 0);
    ivWalllet.setImageResource(R.drawable.checkbox_yes);
    etWalletAmount.setEnabled(true);
    etWalletAmount.requestFocus();
    isETEnable = false;
    } 
else {

    imm.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY,0);
    ivWalllet.setImageResource(R.drawable.checkbox_unchecked);
    etWalletAmount.setEnabled(false);
    isETEnable = true;
    }

Simple, il suffit de supprimer "" tag du fichier XML

0
Jeyanth
private InputMethodManager imm;

...


editText.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        v.onTouchEvent(event);
        hideDefaultKeyboard(v);
        return true;
    }
});

private void hideDefaultKeyboard(View et) {
  getMethodManager().hideSoftInputFromWindow(et.getWindowToken(), 0);
}

private InputMethodManager getMethodManager() {
        if (this.imm == null) {
            this.imm = (InputMethodManager)  getContext().getSystemService(Android.content.Context.INPUT_METHOD_SERVICE);
        }
  return this.imm;
}
0
Denis Raison

Si quelqu'un recherche toujours la solution la plus simple, définissez l'attribut suivant sur true sur votre modèle parent.

Android:focusableInTouchMode="true"

Exemple:

<Android.support.constraint.ConstraintLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:focusableInTouchMode="true">

.......
......
</Android.support.constraint.ConstraintLayout>
0
Ajmal Salim

Ce problème peut être trié en utilisant, Il n'est pas nécessaire de définir editText inputType sur une valeur, Ajoutez simplement la ligne ci-dessous, EditText.setTextIsSelectable (true);

0
arun