Android实现自定义带删除功能的EditText实例

1.说明

自定义带删除功能的EditText有两种方法,第一种是用组合视图的方法,即在一个view视图里面左侧放置一个EditText,右侧放置一个ImageView,但是这样增加了视图的层次,而且对输入内容的长度要做一定的处理。

第二种是重新定义EditText组件,增加相应的事件处理,即可达到很好的效果,效果图如下:

2.ClearEditText的JAVA类文件

/**
 * @说明: 自定义带删除按钮的EditText
 *
 */
public class ClearEditText extends EditText implements OnFocusChangeListener,
    TextWatcher {
  //EditText右侧的删除按钮
  private Drawable mClearDrawable;
  private boolean hasFoucs; 

  public ClearEditText(Context context) {
    this(context, null);
  } 

  public ClearEditText(Context context, AttributeSet attrs) {
    this(context, attrs, android.R.attr.editTextStyle);
  } 

  public ClearEditText(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init();
  } 

  private void init() {
    // 获取EditText的DrawableRight,假如没有设置我们就使用默认的图片,获取图片的顺序是左上右下(0,1,2,3,)
    mClearDrawable = getCompoundDrawables()[2];
    if (mClearDrawable == null) {
      mClearDrawable = getResources().getDrawable(
          R.drawable.edit_delete);
    } 

    mClearDrawable.setBounds(0, 0, mClearDrawable.getIntrinsicWidth(),
        mClearDrawable.getIntrinsicHeight());
    // 默认设置隐藏图标
    setClearIconVisible(false);
    // 设置焦点改变的监听
    setOnFocusChangeListener(this);
    // 设置输入框里面内容发生改变的监听
    addTextChangedListener(this);
  } 

  /* @说明:isInnerWidth, isInnerHeight为ture,触摸点在删除图标之内,则视为点击了删除图标
   * event.getX() 获取相对应自身左上角的X坐标
   * event.getY() 获取相对应自身左上角的Y坐标
   * getWidth() 获取控件的宽度
   * getHeight() 获取控件的高度
   * getTotalPaddingRight() 获取删除图标左边缘到控件右边缘的距离
   * getPaddingRight() 获取删除图标右边缘到控件右边缘的距离
   * isInnerWidth:
   * getWidth() - getTotalPaddingRight() 计算删除图标左边缘到控件左边缘的距离
   * getWidth() - getPaddingRight() 计算删除图标右边缘到控件左边缘的距离
   * isInnerHeight:
   * distance 删除图标顶部边缘到控件顶部边缘的距离
   * distance + height 删除图标底部边缘到控件顶部边缘的距离
   */
  @Override
  public boolean onTouchEvent(MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_UP) {
      if (getCompoundDrawables()[2] != null) {
        int x = (int)event.getX();
        int y = (int)event.getY();
        Rect rect = getCompoundDrawables()[2].getBounds();
        int height = rect.height();
        int distance = (getHeight() - height)/2;
        boolean isInnerWidth = x > (getWidth() - getTotalPaddingRight()) && x < (getWidth() - getPaddingRight());
        boolean isInnerHeight = y > distance && y <(distance + height);
        if (isInnerWidth && isInnerHeight) {
          this.setText("");
        }
      }
    }
    return super.onTouchEvent(event);
  } 

  /**
   * 当ClearEditText焦点发生变化的时候,
   * 输入长度为零,隐藏删除图标,否则,显示删除图标
   */
  @Override
  public void onFocusChange(View v, boolean hasFocus) {
    this.hasFoucs = hasFocus;
    if (hasFocus) {
      setClearIconVisible(getText().length() > 0);
    } else {
      setClearIconVisible(false);
    }
  } 

  protected void setClearIconVisible(boolean visible) {
    Drawable right = visible ? mClearDrawable : null;
    setCompoundDrawables(getCompoundDrawables()[0],
        getCompoundDrawables()[1], right, getCompoundDrawables()[3]);
  } 

  @Override
  public void onTextChanged(CharSequence s, int start, int count, int after) {
    if (hasFoucs) {
      setClearIconVisible(s.length() > 0);
    }
  } 

  @Override
  public void beforeTextChanged(CharSequence s, int start, int count,
      int after) { 

  } 

  @Override
  public void afterTextChanged(Editable s) { 

  } 

}

3.引用ClearEditText的XML文件

<com.once.android_ui.selfview.ClearEditText
    android:id="@+id/user_name"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:drawableLeft="@drawable/user_name"
    android:drawablePadding="7dp"
    android:hint="@string/name_tip"
    android:singleLine="true"
    android:textSize="17sp" >
    <requestFocus />
  </com.once.android_ui.selfview.ClearEditText> 

附件是图片资源文件。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android中自定义的dialog中的EditText无法弹出输入法解决方案

    1.解决无法弹出输入法: 在show()方法调用之前,用dialog.setView(new EditText(context))添加一个空的EditText,由于是自定义的AlertDialog,有我们指定的布局,所以设置这个不会影响我们的功能,这样就可以弹出输入法了-- 2.可以弹出输入法了,但了为了增强用户体验性,当dialog中含有editText时应该,在显示dialog的同时自动弹出键盘: (1) 可以在自定义的dialog中增加如下方法: public void showKeybo

  • Android之EditText控制禁止输入空格和回车

    1.EdiTtext输入框控制不能输入空格,给EditText添加一个addTextChangedListener监听,如果有空格split截取截取再for循环将截取后不包含空格的字符串数组重新排列这样这个字符串就不包含空格了,最后将这个字符串重新写入EditText,这时会出现一个问题就是光标会自动跳转到第一个位置,在onTextChanged中会有一个叫做start的变量他会传入在这个空格输入之前的光标位置,EditText.setSelection(int)来改变光标的位置具体位置. 具体

  • Android EditText限制输入字符的方法总结

     Android EditText限制输入字符的方法总结 最近项目要求限制密码输入的字符类型, 例如不能输入中文.   现在总结一下EditText的各种实现方式,  以比较各种方法的优劣.  第一种方式:  设置EditText的inputType属性,可以通过xml或者Java文件来设置.假如我要设置为显示密码的形式,可以像下面这样设置: 在xml中,   Android:inputType="textPassword" 在java文件中,可以用 ev.setInputType(I

  • Android 设置Edittext获取焦点并弹出软键盘

    Android 设置Edittext获取焦点并弹出软键盘 /** * EditText获取焦点并显示软键盘 */ public static void showSoftInputFromWindow(Activity activity, EditText editText) { editText.setFocusable(true); editText.setFocusableInTouchMode(true); editText.requestFocus(); activity.getWind

  • Android中搜索图标和文字居中的EditText实例

    效果图: 需要自定义view,具体实现如下: import android.widget.EditText; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.drawable.Drawable; import android.uti

  • Android编程实现实时监听EditText文本输入的方法

    本文实例讲述了Android编程实现实时监听EditText文本输入的方法.分享给大家供大家参考,具体如下: 平时在做Android开发过程中经常要用到EditText,有时候可能需要监听你在TextView中输入的字数的状态和变化,以便于我们能做相应的提示和操作.我们可以通过下面的方式来实现. class EditChangedListener implements TextWatcher { private CharSequence temp;//监听前的文本 private int edi

  • Android EditText实现分割输入内容

    在项目中可能会有许多需要输入手机号码.银行卡号或者身份证号等内容的输入框.如果直接输入的话将会是一堆号码堆在一起,第一是不太美观,第二也容易出错,用户体验不太好.但是若将输入的号码按特定格式进行分割将会大大提高用户体验! 以下是对常用的号码进行简单封装的自定义输入框控件,方便我们在开发过程中使用: 该控件支持xml属性指定,也支持代码指定: 该控件支持类型分别为电话号码(000 0000 0000).银行卡号(0000 0000 0000 0000 000)和身份证号(000000 0000 0

  • Android实现自定义带删除功能的EditText实例

    1.说明 自定义带删除功能的EditText有两种方法,第一种是用组合视图的方法,即在一个view视图里面左侧放置一个EditText,右侧放置一个ImageView,但是这样增加了视图的层次,而且对输入内容的长度要做一定的处理. 第二种是重新定义EditText组件,增加相应的事件处理,即可达到很好的效果,效果图如下: 2.ClearEditText的JAVA类文件 /** * @说明: 自定义带删除按钮的EditText * */ public class ClearEditText ext

  • Android实现自定义带文字和图片Button的方法

    本文实例讲述了Android实现自定义带文字和图片Button的方法.分享给大家供大家参考.具体分析如下: 在Android开发中经常会需要用到带文字和图片的button,下面来讲解一下常用的实现办法. 一.用系统自带的Button实现 最简单的一种办法就是利用系统自带的Button来实现,这种方式代码量最小.在Button的属性中有一个是drawableLeft,这个属性可以把图片设置在文字的左边,但是这种方式必须让icon的背景色是透明的,如果icon的背景色不是透明的话,会导致点击按钮时i

  • Android 线程之自定义带消息循环Looper的实例

    Android 线程之自定义带消息循环Looper的实例 Android系统的UI线程是一种带消息循环(Looper)机制的线程,同时Android也提供了封装有消息循环(Looper)的HandlerThread类,这种线程,可以绑定Handler()对象,并通过Handler的sendMessage()函数向线程发送消息,通过handleMessage()函数,处理线程接收到的消息.这么说比较抽象,那么,本文就利用基础的Java类库,实现一个带消息循环(Looper)的线程,以帮助初学者理解

  • Android条目拖拽删除功能实例代码

    项目中需求,要做条目条目拖拽删除效果,实际效果和QQ消息删除一样,侧滑有制定和删除. 效果图 第一步效果图 1.0自定义控件 SwipeLayout 继承FrameLayout重写里面三个构造方法,分别调用initView(). 2.0在布局中使用自定义控件 3.0在initView()方法中,创建拖拽辅辅助工具 ViewDragHelper() 该方法需要传入回调 MyCallBack() 4.0,创建MyCallBack()回调,继承ViewDragHelper.Callback 在回调中

  • Android开发实现带清空按钮的EditText示例

    本文实例讲述了Android开发实现带清空按钮的EditText.分享给大家供大家参考,具体如下: 一.效果图: 二.具体代码: import android.content.Context; import android.graphics.drawable.Drawable; import android.support.v4.content.ContextCompat; import android.support.v4.graphics.drawable.DrawableCompat; i

  • Android 实现自定义圆形listview功能的实例代码

    最近遇到一个需求需要圆形listview作为悬浮窗,费了九牛二虎之力终于开发出来了,特别有成就感,下面分享下案例,项目原因,只能分享一部分供大家参考 1.有图有真相 下面就来讲解下代码: 1.自定义listview import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapFactory;

  • Jquery实现select multiple左右添加和删除功能的简单实例

    项目要实现这样的一个功能(如下图所示):选择左边下拉列表框中的选项,点击添加按钮,把选择的选项移动到右边的下拉列表框中,同样的选择右边的选项,点击删除按钮,即把选择的选项移动到左边的下拉列表框中.相信用js很多朋友都写过,下面是我用jQuery来实现这样的功能的. 具体代码如下: <center> <table> <tr align="center"> <td colspan="3"> 选择 </td> &

  • java自定义Scanner类似功能类的实例讲解

    读取键盘输入 package com.zjx.io; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; /** * 面试题 * 读取键盘各个数据类型 * */ public class TestFaceIo { public static void main(String[] args) { System.out.print("请输入姓名: "); S

  • Android通讯录开发之删除功能的实现方法

    无论是Android开发或者是其他移动平台的开发,ListView肯定是一个大咖,那么对ListView的操作肯定是不会少的,上一篇博客介绍了如何实现全选和反选的功能,本篇博客介绍删除功能,删除列表中的项无谓就是及时刷新列表,这又跟UI线程扯上关系了,还是那句话,数据的更新通知一定要在UI线程上做,不然会出现各种错误,比如出现adapter数据源改变,但没有及时收到通知的情况.在执行遍历删除的时候,最好不要每删一个就直接通知,下面是我的实现方法,将需要删除的contact保存到一个List然后通

随机推荐