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
.
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.
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 :
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
Drawable x = getResources().getDrawable(R.drawable.x);
x.setBounds(0, 0, x.getIntrinsicWidth(), x.getIntrinsicHeight());
mEditText.setCompoundDrawables(null, null, x, null);
où x est:
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
)
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" />
_
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"
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
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.
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" />
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("");
}
});
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:
Utilisation
Android:drawableRight="@Android:drawable/ic_input_delete"
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);
}
}
});
}
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.
<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;
}