是否有类似于EditText
的小部件,其中包含一个带叉号的按钮,或者是否有EditText
的属性可以自动创建它?我希望在EditText
中编写任何文本后,都能使用叉号按钮删除文本。
是否有类似于EditText
的小部件,其中包含一个带叉号的按钮,或者是否有EditText
的属性可以自动创建它?我希望在EditText
中编写任何文本后,都能使用叉号按钮删除文本。
2020年的解决方案:使用Material Design Components for Android:
将Material Components添加到您的gradle设置中:
从此处查找最新版本:https://maven.google.com/
implementation 'com.google.android.material:material:1.3.0'
或者如果您还没有更新为使用AndroidX库,可以按照以下方式添加:
implementation 'com.android.support:design:28.0.0'
然后
<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>
注意: app:endIconMode="clear_text"
使用以下布局:
<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>
你也可以使用按钮的id,在其onClickListner方法中执行任何想要的操作。
如果你使用DroidParts,我刚刚添加了ClearableEditText。
这是它使用自定义背景和清除图标设置为abs__ic_clear_holo_light
来自ActionBarSherlock的样子:
这是一个 Kotlin 解决方案。将此辅助方法放入某个 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
})
}
然后在onCreate
方法中使用它,你就可以开始了——
yourEditText.setupClearButtonWithAction()
顺便提一下,您需要首先添加 R.drawable.ic_clear
或清除图标。这个来自谷歌 - https://fonts.google.com/icons?selected=Material%20Icons%20Outlined%3Aclear%3A
return true
语句前插入 this.clearFocus()
,你可以使用 onFocusChange
监听器,在 EditText 调用者上监听这个事件。 - Joost SchepelsetCompoundDrawablesWithIntrinsicBounds(0, 0, clearIcon, 0)
。您可以将左侧的可绘制图标 ID 作为新参数传递给此函数并放入调用中。 - GulshanAndroid的支持库有一个SearchView
类可以实现这一功能。(虽然不是从EditText
派生而来,但仍需使用SearchView.OnQueryTextListener
而非TextWatcher
)
在XML中使用如下:
<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);
其中,x为:
drawable资源
可以使用标准的安卓图片:android:background="@android:drawable/ic_menu_close_clear_cancel"
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;
}
});
motionEvent.getRawX()
。 - CoolMindmotionEvent.getRawX()
不是返回相对于屏幕的绝对坐标吗?这个解决方案需要相对于视图的坐标,而 motionEvent.getX()
则可以实现。 - Andrei Tudor DiaconugetRawX()
有帮助。此页面上还有两个解决方案使用了 rawX()
。但我同意你的观点,这取决于具体情况。 - CoolMind只需在你的EditText
中添加类似于drawableEnd
的关闭交叉图标:
<EditText
...
android:drawableEnd="@drawable/ic_close"
android:drawablePadding="8dp"
... />
并使用扩展程序处理点击(或直接在EditText
上使用OnTouchListener
):
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
}
}
扩展使用:
editText.onDrawableEndClick {
// TODO clear action
etSearch.setText("")
}
清晰的文本:
"带有清除文本尾随图标的文本字段。"
如果设置,当文本存在时,会显示一个图标,按下它可以清除输入的文本。
...
app:endIconMode="clear_text">
...
</com.google.android.material.textfield.TextInputLayout>