¿Hay algún widget como el EditText
que contiene un botón cruzado, o hay alguna propiedad para la EditText
cual se crea automáticamente? Quiero que el botón cruzado elimine cualquier texto escrito EditText
.
¿Hay algún widget como el EditText
que contiene un botón cruzado, o hay alguna propiedad para la EditText
cual se crea automáticamente? Quiero que el botón cruzado elimine cualquier texto escrito EditText
.
Respuestas:
Use el siguiente diseño:
<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>
También puede usar la identificación del botón y realizar cualquier acción que desee en su método onClickListener.
Si utiliza DroidParts , acabo de agregar ClearableEditText .
Esto es lo que parece con un fondo personalizado y un ícono claro configurado abs__ic_clear_holo_light
desde ActionBarSherlock :
EditText
. Thx @yanchenko
Solución 2020 a través de Componentes de diseño de materiales para Android:
Agregue componentes de material a su configuración de gradle:
Busque la última versión desde aquí: https://maven.google.com/
implementation 'com.google.android.material:material:1.1.0'
o si no ha actualizado el uso de las bibliotecas de AndroidX, puede agregarlo de esta manera:
implementation 'com.android.support:design:28.0.0'
Luego
<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>
Presta atención a: app: endIconMode = "clear_text"
Como se discutió aquí Documentos de diseño de materiales
<androidx.appcompat.widget.AppCompatEditText/>
? puede usted por favor me ayude en la misma
Esta es una solución de Kotlin. Ponga este método auxiliar en algún archivo 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
})
}
Y luego úsalo de la siguiente manera en el onCreate
método y deberías estar listo para comenzar.
yourEditText.setupClearButtonWithAction()
Por cierto, R.drawable.ic_clear
primero debes agregar o borrar el ícono. Este es de google- https://material.io/tools/icons/?icon=clear&style=baseline
this.clearFocus()
antes de la declaración de retorno verdadero, puede escuchar este evento en la persona que llama EditText con el onFocusChange
oyente
setCompoundDrawablesWithIntrinsicBounds(0, 0, clearIcon, 0)
. Puede pasar el ID del icono dibujable izquierdo como un nuevo parámetro a esta función y ponerlo en la llamada.
La biblioteca de soporte de Android tiene una SearchView
clase que hace exactamente esto. (Sin EditText
embargo, no está derivado de , así que debe usar a en SearchView.OnQueryTextListener
lugar de a TextWatcher
)
Usar en XML así:
<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" />
Drawable x = getResources().getDrawable(R.drawable.x);
x.setBounds(0, 0, x.getIntrinsicWidth(), x.getIntrinsicHeight());
mEditText.setCompoundDrawables(null, null, x, null);
donde, x es:
Para drawable resource
que pueda utilizar imágenes de Android estándar:
http://androiddrawables.com/Menu.html
Por ejemplo :
android:background="@android:drawable/ic_menu_close_clear_cancel"
Si no desea usar vistas personalizadas o diseños especiales, puede usar 9 parches para hacer el botón (X).
Ejemplo: http://postimg.org/image/tssjmt97p/ (No tengo suficientes puntos para publicar imágenes en StackOverflow)
La intersección de los píxeles negros derecho e inferior representa el área de contenido. Cualquier cosa fuera de esa área es relleno. Entonces, para detectar que el usuario hizo clic en la x, puede configurar un OnTouchListener de esta manera:
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;
}
});
Según sus necesidades, esta solución puede funcionar mejor en algunos casos. Prefiero mantener mi xml menos complicado. Esto también ayuda si desea tener un icono a la izquierda, ya que simplemente puede incluirlo en el parche 9.
Hice la parte de la interfaz de usuario como a continuación:
<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" />
Botón Cruz / Borrar ocultar / mostrar:
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) {}
});
Manejar material de búsqueda (es decir, cuando el usuario hace clic en buscar desde el tablero de teclas programables)
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;
}
});`
Botón Borrar / Cruz
clearSearch.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
searchBox.setText("");
}
});
Utilizar
android:drawableRight="@android:drawable/ic_input_delete"
Aquí hay una biblioteca completa con el widget: https://github.com/opprime/EditTextField
Para usarlo debes agregar la dependencia:
compile 'com.optimus:editTextField:0.2.0'
En el archivo layout.xml puedes jugar con la configuración del widget:
xmlns:app="http://schemas.android.com/apk/res-auto"
aplicación: clearButtonMode, puede tener tales valores: nunca siempre whileEditing a menos que se edite
aplicación: clearButtonDrawable
Muestra en acción:
Simplemente ponga una cruz cerca como drawableEnd
en su EditText
:
<EditText
...
android:drawableEnd="@drawable/ic_close"
android:drawablePadding="8dp"
... />
y use la extensión para manejar el clic (o use OnTouchListener
directamente en su EditText
):
fun EditText.onDrawableEndClick(action: () -> Unit) {
setOnTouchListener { v, event ->
if (event.action == MotionEvent.ACTION_UP) {
v as EditText
val end = if (v.resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL)
v.left else v.right
if (event.rawX >= (end - v.compoundPaddingEnd)) {
action.invoke()
return@setOnTouchListener true
}
}
return@setOnTouchListener false
}
}
uso de extensión:
editText.onDrawableEndClick {
// TODO clear action
etSearch.setText("")
}
Puede usar este fragmento con la respuesta de Jaydip para más de un botón. simplemente llámelo después de obtener una referencia a ET y Button Elements. Usé el botón vecotr, así que debes cambiar el elemento Button a 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 está en el diseño del marco o puede crear un diseño del marco, intenté otro enfoque ...
<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"
/>
Este es un texto de edición en el que pongo un ícono de cruz como un dibujo derecho y, luego, coloco un botón transparente que borra el texto.
<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;
}