如何用十字(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(""); } }); 

你可以在这里下载源代码:

https://github.com/GhOsTTT/editTextXbutton

祝你今天愉快

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