Comment créer EditText avec le bouton cross (x) à la fin de celui-ci?

Est-il un widget comme EditText, qui contient un bouton croix, ou est-il un bien pour EditText par lequel il est créé automatiquement? Je veux que le bouton croisé supprime tout texte écrit dans EditText.

158
demandé sur Joel Christophel 2011-06-15 12:40:20

14 réponses

Utilisez la disposition suivante:

<FrameLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="9dp"
    android:padding="5dp">

    <EditText
        android:id="@+id/calc_txt_Prise"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:inputType="numberDecimal"  
        android:layout_marginTop="20dp"
        android:textSize="25dp"
        android:textColor="@color/gray"
        android:textStyle="bold"
        android:hint="@string/calc_txt_Prise"
        android:singleLine="true" />

    <Button
        android:id="@+id/calc_clear_txt_Prise"      
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="10dp"
        android:layout_gravity="right|center_vertical"
        android:background="@drawable/delete" />

</FrameLayout>

Vous pouvez également utiliser l'id du bouton et effectuer l'action que vous voulez sur sa méthode onClickListener.

151
répondu Jaydeep Khamar 2013-08-16 16:48:55

Si vous utilisez DroidParts , je viens d'ajouter ClearableEditText.

Voici à quoi cela ressemble avec un arrière-plan personnalisé et une icône claire définie sur abs__ic_clear_holo_light à partir de ActionBarSherlock :

entrez la description de l'image ici

112
répondu yanchenko 2017-06-29 18:12:02

Vous pouvez également vérifier ceci pour la réponse modifiée et étendue ClearableEditText .

21
répondu AB1209 2011-12-16 07:32:43
Drawable x = getResources().getDrawable(R.drawable.x);
x.setBounds(0, 0, x.getIntrinsicWidth(), x.getIntrinsicHeight());
mEditText.setCompoundDrawables(null, null, x, null);

Où x est:

entrez la description de l'image ici

14
répondu Eamorr 2013-02-02 12:43:01

Pour drawable resource vous pouvez utiliser des images Android standard:

Http://androiddrawables.com/Menu.html

Par exemple :

android:background="@android:drawable/ic_menu_close_clear_cancel"
11
répondu 0x8BADF00D 2015-10-26 17:07:40

Android soutien de la bibliothèque dispose d'un SearchView la classe qui fait exactement cela. (Pas derrived de EditText cependant, il faut donc utiliser un SearchView.OnQueryTextListener au lieu d'un TextWatcher)

Vue de recherche sans texte (et texte d'indice " recherche")

entrez la description de l'image ici

Utiliser en XML comme ceci:

  <android.support.v7.widget.SearchView
            android:id="@+id/searchView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:iconifiedByDefault="false"
            android:queryHint="@string/SearchHint"
            app:iconifiedByDefault="false"
            app:queryHint="@string/SearchHint" />
8
répondu Diederik 2017-10-13 13:55:53

Si vous ne voulez pas utiliser des vues personnalisées ou des mises en page spéciales, vous pouvez utiliser 9-patch pour créer le bouton (X).

Exemple: http://postimg.org/image/tssjmt97p/ (Je n'ai pas assez de points pour poster des images sur StackOverflow)

L'intersection des pixels noirs droit et inférieur représente la zone de contenu. Tout ce qui est en dehors de cette zone est rembourrage. Donc, pour détecter que l'Utilisateur a cliqué sur le x, vous pouvez définir un OnTouchListener comme suit:

editText.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                if (motionEvent.getAction() == MotionEvent.ACTION_UP){
                    if (motionEvent.getX()>(view.getWidth()-view.getPaddingRight())){
                        ((EditText)view).setText("");
                    }
                }
                return false;
            }
        });

Selon vos besoins cette solution peut mieux fonctionner dans certains cas. Je préfère garder mon xml moins compliqué. Cela aide également si vous voulez avoir une icône sur la gauche, comme vous pouvez simplement l'inclure dans le 9 patch.

5
répondu Andrei Tudor Diaconu 2013-08-23 08:38:36

Ceci est une solution kotlin. Mettez cette méthode d'aide dans un fichier kotlin -

fun EditText.setupClearButtonWithAction() {

    addTextChangedListener(object : TextWatcher {
        override fun afterTextChanged(editable: Editable?) {
            val clearIcon = if (editable?.isNotEmpty() == true) R.drawable.ic_clear else 0
            setCompoundDrawablesWithIntrinsicBounds(0, 0, clearIcon, 0)
        }

        override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) = Unit
        override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) = Unit
    })

    setOnTouchListener(View.OnTouchListener { _, event ->
        if (event.action == MotionEvent.ACTION_UP) {
            if (event.rawX >= (this.right - this.compoundPaddingRight)) {
                this.setText("")
                return@OnTouchListener true
            }
        }
        return@OnTouchListener false
    })
}

Et puis utilisez-le comme suit dans la méthode onCreate et vous devriez être bon pour aller -

yourEditText.setupClearButtonWithAction()

BTW, vous devez ajouter R.drawable.ic_clear ou l'icône effacer au premier abord. Celui-ci est de google - https://material.io/tools/icons/?icon=clear&style=baseline

4
répondu Gulshan 2018-07-28 06:03:17

J'ai fait la partie UI comme ci-dessous:

<RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="50dp"
            android:layout_marginTop="9dp"
            android:padding="5dp">

            <EditText
                android:id="@+id/etSearchToolbar"
                android:layout_width="fill_parent"
                android:layout_height="match_parent"
                android:textSize="13dp"
                android:padding="10dp"
                android:textColor="@android:color/darker_gray"
                android:textStyle="normal"
                android:hint="Search"
                android:imeOptions="actionSearch"
                android:inputType="text"
                android:background="@drawable/edittext_bg"
                android:maxLines="1" />

            <ImageView
                android:id="@+id/ivClearSearchText"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_marginRight="6dp"
                android:src="@drawable/balloon_overlay_close"
                android:layout_alignParentRight="true"
                android:layout_alignParentEnd="true" />


        </RelativeLayout>

Edittext_bg.xml

<?xml version="1.0" encoding="utf-8"?>

<solid android:color="#FFFFFF" />

<stroke
    android:width="1dp"
    android:color="#C9C9CE" />

<corners
    android:bottomLeftRadius="15dp"
    android:bottomRightRadius="15dp"
    android:topLeftRadius="15dp"
    android:topRightRadius="15dp" />

balloon_overlay_close.pngentrez la description de l'image ici

Croix / effacer le bouton Masquer / Afficher:

searchBox.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            if(charSequence.length() > 0){
                clearSearch.setVisibility(View.VISIBLE);
            }else{
                clearSearch.setVisibility(View.GONE);
            }
        }

        @Override
        public void afterTextChanged(Editable editable) {}
    });

Gérer les objets de recherche (c'est-à-dire lorsque l'utilisateur clique sur la recherche à partir du panneau de touches programmables)

searchBox.setOnEditorActionListener(new TextView.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_SEARCH) {
                String contents = searchBox.getText().toString().trim();
                if(contents.length() > 0){
                    //do search

                }else
                    //if something to do for empty edittext

                return true;
            }
            return false;
        }
    });`

Bouton Effacer / Croix

  clearSearch.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            searchBox.setText("");
        }
    });
3
répondu Ranjit 2017-06-16 07:30:10

Vous pouvez télécharger la source ici:

Https://github.com/GhOsTTT/editTextXbutton

Bonne Journée

2
répondu Gökhan Musapaşaoğlu ヅ 2014-01-28 08:38:22

Voici la bibliothèque complète avec le widget: https://github.com/opprime/EditTextField

Pour l'utiliser, vous devez ajouter la dépendance:

compile 'com.optimus:editTextField:0.2.0'

Dans la mise en page.fichier xml vous pouvez jouer avec les paramètres du widget:

xmlns:app="http://schemas.android.com/apk/res-auto"
  • App: clearButtonMode can Peut a ces valeurs: jamais Toujours whileEditing unlessEditing

  • Application: clearButtonDrawable

Échantillon en action:

entrez la description de l'image ici

2
répondu Kirill Vashilo 2017-05-06 11:07:03

Utiliser

android:drawableRight="@android:drawable/ic_input_delete"
1
répondu HimalayanCoder 2015-09-12 09:35:09

Vous pouvez utiliser cet extrait avec la réponse Jaydip pour plus d'un bouton. appelez-le simplement après avoir obtenu une référence aux éléments ET et Button. J'ai utilisé le bouton vecotr, donc vous devez changer l'élément Button en ImageButton:

private void setRemovableET(final EditText et, final ImageButton resetIB) {

        et.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus && et.getText().toString().length() > 0)
                    resetIB.setVisibility(View.VISIBLE);
                else
                    resetIB.setVisibility(View.INVISIBLE);
            }
        });

        resetIB.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                et.setText("");
                resetIB.setVisibility(View.INVISIBLE);
            }
        });

        et.addTextChangedListener(new TextWatcher() {
            @Override
            public void afterTextChanged(Editable s) {}
            @Override
            public void beforeTextChanged(CharSequence s, int start,
                                          int count, int after) {
            }
            @Override
            public void onTextChanged(CharSequence s, int start,
                                      int before, int count) {
                if(s.length() != 0){
                    resetIB.setVisibility(View.VISIBLE);
                }else{
                    resetIB.setVisibility(View.INVISIBLE);
                }
            }
        });
    }
1
répondu sivi 2016-01-05 11:05:56

Si vous êtes dans la mise en page de cadre ou si vous pouvez créer une mise en page de cadre, j'ai essayé une autre approche....

<TextView
    android:id="@+id/inputSearch"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:drawableRight="@drawable/ic_actionbar"
    android:layout_alignParentBottom="true"
    android:layout_toRightOf="@+id/back_button"/>

<Button
    android:id="@+id/clear_text_invisible_button"
    android:layout_width="30dp"
    android:layout_height="30dp"
    android:layout_gravity="right|center_vertical"
    android:background="@color/transparent"
    android:layout_alignBaseline="@+id/inputSearch"
    android:layout_alignBottom="@+id/inputSearch"
    android:layout_alignRight="@+id/inputSearch"
    android:layout_alignEnd="@+id/inputSearch"
    android:layout_marginRight="13dp"
    />

C'est un texte d'édition où je mets une icône en croix comme un drawable droit et que je mets un bouton transparent qui efface le texte.

0
répondu Kleand Sherali 2015-01-24 14:46:22