web-dev-qa-db-fra.com

Comment créer EditText avec un bouton croix (x) à la fin?

Existe-t-il un widget comme EditText qui contient un bouton en croix ou une propriété pour EditText avec laquelle il est créé automatiquement? Je veux que le bouton croix supprime tout texte écrit en EditText.

176
AB1209

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'identifiant du bouton et effectuer l'action de votre choix sur sa méthode onClickListener.

160
Jaydeep Khamar

S'il vous arrive d'utiliser DroidParts , je viens d'ajouter ClearableEditText .

Voici à quoi cela ressemble avec un fond personnalisé et une icône vide définie sur abs__ic_clear_holo_light de ActionBarSherlock :

enter image description here

117
yanchenko

Ceci est une solution Kotlin. Mettez cette méthode d'assistance 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 ensuite utilisez-le comme suit dans la méthode onCreate et vous devriez être bon à aller-

yourEditText.setupClearButtonWithAction()

Par ailleurs, vous devez d’abord ajouter R.drawable.ic_clear ou l’icône Clear. Celui-ci provient de google- https://material.io/tools/icons/?icon=clear&style=baseline

25
Gulshan
Drawable x = getResources().getDrawable(R.drawable.x);
x.setBounds(0, 0, x.getIntrinsicWidth(), x.getIntrinsicHeight());
mEditText.setCompoundDrawables(null, null, x, null);

où x est:

enter image description here

16
Eamorr

La bibliothèque de support d'Android a une classe SearchView qui fait exactement cela. (Non dérivé de EditText cependant, il faut donc utiliser un SearchView.OnQueryTextListener au lieu d'un TextWatcher)

Search view with no text (and hint text "Search")

enter image description here

Utilisez en XML comme suit:

_  <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" />
_
14
Diederik

Pour drawable resource, vous pouvez utiliser des images standard Android:

http://androiddrawables.com/Menu.html

Par exemple :

Android:background="@Android:drawable/ic_menu_close_clear_cancel"
11
0x8BADF00D

Solution 2019 via Material Components pour Android:

Ajoutez des composants de matériau à votre configuration Gradle:

implementation 'com.google.Android.material:material:1.1.0-alpha06'

ou si vous n'avez pas mis à jour pour utiliser les bibliothèques AndroidX, vous pouvez l'ajouter de cette façon:

implementation 'com.Android.support:design:28.0.0'

Ensuite

<com.google.Android.material.textfield.TextInputLayout
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:hint="@string/hint_text"
    app:endIconMode="clear_text">

  <com.google.Android.material.textfield.TextInputEditText
      Android:layout_width="match_parent"
      Android:layout_height="wrap_content"/>

</com.google.Android.material.textfield.TextInputLayout>

Faites attention à: app: endIconMode = "clear_text"

Comme discuté ici Documents de conception de matériaux

6
kevoroid

Si vous ne souhaitez pas utiliser de vues personnalisées ou de dispositions 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 publier des images sur StackOverflow)

L'intersection des pixels noirs de droite et du bas représente la zone de contenu. Tout ce qui se trouve en dehors de cette zone est un rembourrage. Donc, pour détecter que l'utilisateur a cliqué sur le x, vous pouvez définir un OnTouchListener comme ceci:

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 à gauche, car vous pouvez simplement l'inclure dans le patch.

5

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.png enter image description here

Bouton Cacher/effacer 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) {}
    });

Gestion des éléments de recherche (lorsque l'utilisateur clique sur la recherche dans le 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 d'effacement/croix

  clearSearch.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            searchBox.setText("");
        }
    });
3
Ranjit

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 le fichier layout.xml, vous pouvez jouer avec les paramètres du widget:

xmlns:app="http://schemas.Android.com/apk/res-auto"
  • app: clearButtonMode , peut avoir de telles valeurs: jamais toujours pendant l'edition, sauf l'edition

  • application: clearButtonDrawable

Echantillon en action:

enter image description here

2
Kirill Vashilo

Utilisation

Android:drawableRight="@Android:drawable/ic_input_delete"
2
HimalayanCoder

Vous pouvez télécharger la source ici:

https://github.com/GhOsTTT/editTextXbutton

bonne journée

Vous pouvez utiliser cet extrait avec Jaydip answer pour plusieurs boutons. appelez-le simplement après avoir obtenu une référence aux éléments ET et Button Elements. J'ai utilisé vecotr button donc vous devez changer l'élément Button à 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
sivi

Si vous êtes dans la mise en page ou vous pouvez créer une mise en page, 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"
    />

Ceci est un texte d'édition dans lequel je mets une icône en forme de croix pour dessiner à droite et ensuite, je mets dessus un bouton transparent qui efface le texte.

0
Kleand Sherali
    <EditText
    Android:id="@+id/idSearchEditText"
    Android:layout_width="match_parent"
    Android:layout_height="@dimen/dimen_40dp"
    Android:drawableStart="@Android:drawable/ic_menu_search"
    Android:drawablePadding="8dp"
    Android:ellipsize="start"
    Android:gravity="center_vertical"
    Android:hint="Search"
    Android:imeOptions="actionSearch"
    Android:inputType="text"
    Android:paddingStart="16dp"
    Android:paddingEnd="8dp"
/>

EditText mSearchEditText = findViewById(R.id.idSearchEditText);
mSearchEditText.addTextChangedListener(this);
mSearchEditText.setOnTouchListener(this);


@Override
public void afterTextChanged(Editable aEditable) {
    int clearIcon = Android.R.drawable.ic_notification_clear_all;
    int searchIcon = Android.R.drawable.ic_menu_search;
    if (aEditable == null || TextUtils.isEmpty(aEditable.toString())) {
        clearIcon = 0;
        searchIcon = Android.R.drawable.ic_menu_search;
    } else {
        clearIcon = Android.R.drawable.ic_notification_clear_all;
        searchIcon = 0;
    }
    Drawable leftDrawable =  null;
    if (searchIcon != 0) {
        leftDrawable = getResources().getDrawable(searchIcon);
    }
    Drawable rightDrawable = null;
    if (clearIcon != 0) {
        rightDrawable = getResources().getDrawable(clearIcon);
    }

    mSearchEditText.setCompoundDrawablesWithIntrinsicBounds(leftDrawable, null, rightDrawable, null);
}


@Override
public boolean onTouch(View aView, MotionEvent aEvent) {
    if (aEvent.getAction() == MotionEvent.ACTION_UP){
        if (aEvent.getX() > ( mSearchEditText.getWidth() - 
         mSearchEditText.getCompoundPaddingEnd())){
            mSearchEditText.setText("");
        }
    }
    return false;
}
0
Anupam Singh