如何用十字(x)按钮在结尾创建EditText?
是否有像EditText
这样的包含十字按钮的小部件,还是有自动创建EditText
的任何属性? 我想要十字按钮删除EditText
写的任何文本。
使用以下布局:
你也可以使用按钮的id,并执行你想要的onClickListener方法的任何行动。
如果你碰巧使用DroidParts ,我刚刚添加了ClearableEditText 。
以下是自定义背景和清除图标从ActionBarSherlock设置为abs__ic_clear_holo_light
:
你也可以检查这个修改和扩展答案ClearableEditText 。
Drawable x = getResources().getDrawable(R.drawable.x); x.setBounds(0, 0, x.getIntrinsicWidth(), x.getIntrinsicHeight()); mEditText.setCompoundDrawables(null, null, x, null);
其中,x是:
对于drawable resource
你可以使用标准的android图像:
http://androiddrawables.com/Menu.html
例如 :
android:background="@android:drawable/ic_menu_close_clear_cancel"
如果您不想使用自定义视图或特殊布局,则可以使用9-patch制作(X)按钮。
例如: http : //postimg.org/image/tssjmt97p/ (我没有足够的点在StackOverflow上发布图像)
右侧和底部黑色像素的交点表示内容区域。 除此之外的任何东西都是填充。 所以要检测用户点击了x,你可以像这样设置一个OnTouchListener:
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; } });
根据您的需求,这个解决方案在某些情况下可以更好地工作 我宁愿保持我的xml更简单。 如果你想在左边有一个图标,这也有帮助,因为你可以简单地将它包含在9补丁中。
我做了如下的UI部分:
edittext_bg.xml
balloon_overlay_close.png
交叉/清除按钮隐藏/显示:
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) {} });
处理搜索内容(即当用户点击软键盘上的搜索时)
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; } });`
清除/交叉按钮
clearSearch.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { searchBox.setText(""); } });
Android的支持libarary有一个SearchView
类正是这个。 (虽然不是来自于EditText
,所以必须使用SearchView.OnQueryTextListener
而不是TextWatcher
)
像这样在XML中使用:
使用
android:drawableRight="@android:drawable/ic_input_delete"
你可以用Jaydip的这个片段来回答多个按钮。 只需在获取对ET和Button元素的引用后调用它即可。 我用vecotr按钮,所以你必须将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); } } }); }
这里是完整的库与小部件: https : //github.com/opprime/EditTextField
要使用它,你应该添加依赖关系:
compile 'com.optimus:editTextField:0.2.0'
在layout.xml文件中,您可以使用小部件设置进行播放:
xmlns:app="http://schemas.android.com/apk/res-auto"
-
应用程序:clearButtonMode,可以有这样的值:永远不会总是whileEditing unlessEditing
-
应用:clearButtonDrawable
示例在行动:
如果你在框架布局,或者你可以创建一个框架布局,我尝试了另一种方法….
这是一个编辑文本,我把一个十字图标作为一个可绘制的,而不是它,我把一个透明的按钮,清除文本。
这是一个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://material.io/icons/#ic_clear