web-dev-qa-db-fra.com

android edittext supprimer le focus après avoir cliqué sur un bouton

J'ai une activité avec un EditText et un bouton . Lorsque l'utilisateur clique sur le EditText, le clavier est affiché et il peut taper du texte - très bien. Mais lorsque l'utilisateur clique sur le bouton, je souhaite que le texte d'édition ne soit plus mis au point, c'est-à-dire que le clavier se cache jusqu'à ce que l'utilisateur clique à nouveau sur le texte d'édition. 

Que puis-je faire pour "masquer le focus" de l'EditText, après avoir cliqué sur le bouton? Du code que je peux ajouter dans la méthode OnClick du bouton pour le faire?

MODIFIER:

<LinearLayout 
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:orientation="horizontal" >

    <EditText 
        Android:id="@+id/edt_SearchDest"
        Android:layout_width="0dip"
        Android:layout_height="wrap_content"
        Android:layout_weight="0.8"
        Android:textSize="18sp"
        Android:hint="Enter your look-up here.." />

    <Button
        Android:id="@+id/btn_SearchDest"
        Android:layout_width="0dip"
        Android:layout_height="wrap_content"
        Android:layout_weight="0.2"
        Android:text="Search" />

</LinearLayout>

Meilleures salutations

16
MojioMS

Mettez ceci dans votre écouteur de boutons:

InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 

inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);

MODIFIER 

La solution ci-dessus cassera votre application si aucune EditText n'est focalisée. Modifiez votre code comme ceci:

ajoutez cette méthode à votre classe:

public static void hideSoftKeyboard (Activity activity, View view) 
{
    InputMethodManager imm = (InputMethodManager)activity.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getApplicationWindowToken(), 0);
}

Ensuite, dans votre écouteur de boutons, appelez la méthode comme ceci:

hideSoftKeyboard(MainActivity.this, v); // MainActivity is the name of the class and v is the View parameter used in the button listener method onClick.
38
Michael Yaworski

Une solution consiste à créer une fausse vue vers laquelle transférer le focus lorsque vous clearFocus dans votre edittext:

<EditText
        Android:id="@+id/edt_thief"
        Android:layout_width="0dp"
        Android:layout_height="0dp"
        Android:focusable="true"
        Android:focusableInTouchMode="true"

Notez que cette vue est invisible et ne nécessite donc aucun espace dans la mise en page.

Dans la classe de contrôle, vous pouvez ajouter une méthode telle que la suivante pour déclencher ce transfert de focus:

public void clearFocus(){
        yourEdittext.clearFocus();
        edtThief.requestFocus();
    }

Vous pouvez ensuite réduire le clavier une fois que edtThief a le focus:

 public static void hideKeyboard(final View view) {
    InputMethodManager imm = (InputMethodManager) view.getContext()
            .getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
9
cuasodayleo

J'ai utilisé avec succès les éléments suivants dans le code du bouton onClick:

editText.setEnabled(false);
editText.setEnabled(true);

Un peu moins complexe que d'autres méthodes ...

8
Mike Redrobe

La solution la plus élégante que j'ai pu trouver est la suivante:

Vous pouvez enregistrer cette méthode dans votre classe d’utilitaire:

public static void hideSoftKeyboard(Activity activity) {
   if (activity == null) return;
   if (activity.getCurrentFocus() == null) return;

   InputMethodManager inputMethodManager = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
   inputMethodManager.hideSoftInputFromWindow(activity.getCurrentFocus().getWindowToken(), 0);
}

En appelant simplement la méthode hideSoftKeyboad (), le clavier sera masqué mais, comme vous pouvez le constater, le focus reste présent.

Afin de supprimer le focus, nous allons utiliser une astuce simple. Juste au-dessus de vos contrôles d’entrée, ajoutez une vue fictive comme celle-ci:

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

Ensuite, écrivez cette ligne de code à l’endroit où vous appelez la méthode de masquage de focus:

 theTextView.clearFocus();

Puisque l'application doit passer le focus au contrôle suivant, il sera transmis à notre vue invisible.

5

Désolé d’avoir tardé à la réponse, mais j’espère que ce sera la bonne réponse car je l’ai corrigé en utilisant

try {
InputMethodManager imm = (InputMethodManager) context
                    .getSystemService(Context.INPUT_METHOD_SERVICE);
if (v != null) {
imm.hideSoftInputFromWindow(v.getWindowToken(),InputMethodManager.HIDE_NOT_ALWAYS);
}
} catch (Exception ignored) {
}
mEditText.setSelected(false);
mEditText.setFocusable(false);
mEditText.setFocusableInTouchMode(true);

Écrivez l'extrait suivant sur votre clic de bouton.

0
ChaitanyaAtkuri
mTextView.setEnabled(!mTextView.isEnabled());
mTextView.setEnabled(!mTextView.isEnabled());
0
grebenyuksv
private void hideDefaultKeyboard() {
    activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);//u have got lot of methods here
}

MODIFIER:

LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
0
Exceptional