Android 带有删除按钮的EditText

MainActivity如下:

package cc.textview5;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import android.app.Activity;
/**
 * Demo描述:
 * 自定义控件实现带清除功能的EditText
 *
 * 学习资料:
 * http://blog.csdn.net/xiaanming/article/details/11066685
 *
 * Thank you very much
 */
public class MainActivity extends Activity {
  private CleanableEditText mUserNameCleanableEditText;
  private CleanableEditText mPassWordCleanableEditText;
  private Button mLoginButton;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    init();
  } 

  private void init(){
    mUserNameCleanableEditText=(CleanableEditText) findViewById(R.id.userNameEditText);
    mPassWordCleanableEditText=(CleanableEditText) findViewById(R.id.passwordEditText);
    mLoginButton=(Button) findViewById(R.id.loginButton);
    mLoginButton.setOnClickListener(new OnClickListenerImpl());
  } 

  private class OnClickListenerImpl implements OnClickListener {
    @Override
    public void onClick(View view) {
      if (TextUtils.isEmpty(mUserNameCleanableEditText.getText())) {
        mUserNameCleanableEditText.setShakeAnimation();
        Toast.makeText(MainActivity.this, "请输入用户名", Toast.LENGTH_SHORT).show();
      } 

      if (TextUtils.isEmpty(mPassWordCleanableEditText.getText())) {
        mPassWordCleanableEditText.setShakeAnimation();
        Toast.makeText(MainActivity.this, "请输入密码", Toast.LENGTH_SHORT).show();
      }
    } 

  } 

}

CleanableEditText如下:

package cc.textview5; 

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.CycleInterpolator;
import android.view.animation.TranslateAnimation;
import android.widget.EditText;
/**
 * 在焦点变化时和输入内容发生变化时均要判断是否显示右边clean图标
 */
public class CleanableEditText extends EditText {
  private Drawable mRightDrawable;
  private boolean isHasFocus; 

  public CleanableEditText(Context context) {
    super(context);
    init();
  }
  public CleanableEditText(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
  } 

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

  private void init(){
    //getCompoundDrawables:
    //Returns drawables for the left, top, right, and bottom borders.
    Drawable [] drawables=this.getCompoundDrawables(); 

    //取得right位置的Drawable
    //即我们在布局文件中设置的android:drawableRight
    mRightDrawable=drawables[2];   

    //设置焦点变化的监听
    this.setOnFocusChangeListener(new FocusChangeListenerImpl());
    //设置EditText文字变化的监听
    this.addTextChangedListener(new TextWatcherImpl());
    //初始化时让右边clean图标不可见
    setClearDrawableVisible(false);
  } 

  /**
   * 当手指抬起的位置在clean的图标的区域
   * 我们将此视为进行清除操作
   * getWidth():得到控件的宽度
   * event.getX():抬起时的坐标(改坐标是相对于控件本身而言的)
   * getTotalPaddingRight():clean的图标左边缘至控件右边缘的距离
   * getPaddingRight():clean的图标右边缘至控件右边缘的距离
   * 于是:
   * getWidth() - getTotalPaddingRight()表示:
   * 控件左边到clean的图标左边缘的区域
   * getWidth() - getPaddingRight()表示:
   * 控件左边到clean的图标右边缘的区域
   * 所以这两者之间的区域刚好是clean的图标的区域
   */
  @Override
  public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
    case MotionEvent.ACTION_UP: 

      boolean isClean =(event.getX() > (getWidth() - getTotalPaddingRight()))&&
               (event.getX() < (getWidth() - getPaddingRight()));
      if (isClean) {
        setText("");
      }
      break; 

    default:
      break;
    }
    return super.onTouchEvent(event);
  } 

  private class FocusChangeListenerImpl implements OnFocusChangeListener{
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
       isHasFocus=hasFocus;
       if (isHasFocus) {
         boolean isVisible=getText().toString().length()>=1;
         setClearDrawableVisible(isVisible);
      } else {
         setClearDrawableVisible(false);
      }
    } 

  } 

  //当输入结束后判断是否显示右边clean的图标
  private class TextWatcherImpl implements TextWatcher{
    @Override
    public void afterTextChanged(Editable s) {
       boolean isVisible=getText().toString().length()>=1;
       setClearDrawableVisible(isVisible);
    } 

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

    } 

    @Override
    public void onTextChanged(CharSequence s, int start, int before,int count) { 

    } 

  }   

  //隐藏或者显示右边clean的图标
  protected void setClearDrawableVisible(boolean isVisible) {
    Drawable rightDrawable;
    if (isVisible) {
      rightDrawable = mRightDrawable;
    } else {
      rightDrawable = null;
    }
    //使用代码设置该控件left, top, right, and bottom处的图标
    setCompoundDrawables(getCompoundDrawables()[0],getCompoundDrawables()[1],
               rightDrawable,getCompoundDrawables()[3]);
  }  

  // 显示一个动画,以提示用户输入
  public void setShakeAnimation() {
    this.setAnimation(shakeAnimation(5));
  } 

  //CycleTimes动画重复的次数
  public Animation shakeAnimation(int CycleTimes) {
    Animation translateAnimation = new TranslateAnimation(0, 10, 0, 10);
    translateAnimation.setInterpolator(new CycleInterpolator(CycleTimes));
    translateAnimation.setDuration(1000);
    return translateAnimation;
  } 

}

main.xml如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:paddingLeft="20dip"
  android:paddingRight="20dip"
  > 

  <cc.textview5.CleanableEditText
    android:id="@+id/userNameEditText"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="username"
    android:layout_marginTop="30dip"
    android:drawableLeft="@drawable/icon_user"
    android:drawableRight="@drawable/clean_selector"
     /> 

   <cc.textview5.CleanableEditText
    android:id="@+id/passwordEditText"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:hint="password"
    android:password="true"
    android:layout_marginTop="100dip"
    android:drawableLeft="@drawable/account_icon"
    android:drawableRight="@drawable/clean_selector"
     /> 

   <Button
     android:id="@+id/loginButton"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Login"
    android:layout_marginTop="155dip"
     /> 

</RelativeLayout>

以上就是对Android   带有删除按钮的EditText的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!

(0)

相关推荐

  • Android实现EditText中添加和删除bitmap的方法

    本文实例讲述了Android实现EditText中添加和删除bitmap的方法.分享给大家供大家参考,具体如下: SpannableString mSpan1 = new SpannableString("1"); /* * this is add bitmap on edit text */ private void displayBitmapOnText(Bitmap thumbnailBitmap) { if(thumbnailBitmap == null) return; in

  • Android实现带有删除按钮的EditText示例代码

    一.首先来看看效果 这是一个带有删除按钮的输入文本框, 需要新建一个类继承自EditText, 先把代码贴出来, 然后在解释: 示例代码如下: public class EditTextWithDel extends EditText { private final static String TAG = "EditTextWithDel"; private Drawable imgInable; private Context mContext; public EditTextWit

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

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

  • Android 带有删除按钮的EditText

    MainActivity如下: package cc.textview5; import android.os.Bundle; import android.text.TextUtils; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; import android.app.Activity;

  • Android ListView实现仿iPhone实现左滑删除按钮的简单实例

    需要自定义ListView.这里就交FloatDelListView吧. 复写onTouchEvent方法.如下: @Override public boolean onTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN:<BR> // 获取按下的条目视图(child view) int childCount = getChildCount(); int[] listViewCo

  • 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仿微信实现左滑显示删除按钮功能

    在实际项目中删除列表中的某一项是非常常见的功能,传统的做法可以使用长按监听器等,而现在流行的做法是左滑弹出删除按钮,微信,QQ等都是这么做的,下面做一个示例,代码如下: 主页面MainActivity:代码比较简单常规 package com.home.testslideview; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; im

  • Android滑动删除数据功能的实现代码

    今天学习了新的功能那就是滑动删除数据.先看一下效果 我想这个效果大家都很熟悉吧.是不是在qq上看见过这个效果.俗话说好记性不如赖笔头,为了我的以后,为了跟我一样自学的小伙伴们,我把我的代码粘贴在下面. activity_lookstaff.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.co

  • Android开发实现按钮点击切换背景并修改文字颜色的方法

    本文实例讲述了Android开发实现按钮点击切换背景并修改文字颜色的方法.分享给大家供大家参考,具体如下: 其实原理很简单,用到的是selector,用来设置android:background和android:textcolor属性,selector可以用来设置默认时候.点击时候的背景图片和文字颜色的属性,过程如下: 这两个文件如下: 1.当点击按钮,改变文字的颜色: <?xml version="1.0" encoding="utf-8"?> <

  • Android实现圆线按钮进度效果

    本文实例为大家分享了Android实现圆线按钮进度效果的具体代码,供大家参考,具体内容如下 先看效果图: 这是一个在github上的开源控件按钮View(点击此处查看),同时带有进度. 使用方法:把该项目从github上下载下来导入到eclipse,然后作为库,接下来在其他项目中直接引用即可.然而,我感觉原生项目中的个别细节代码不是太完善,我在它的MasterLayout.java类增加了一些字段和方法: // 增加的值,by Phil public static final int START

  • Android带清除按钮、密码可见小眼睛的输入框

    前言 相信不少小伙伴在开发登录功能时候,或多或少都会用到输入框清除按钮.密码可见与隐藏小眼睛按钮,我之前也是但写这个功能,但是在找回密码.忘记密码里面还要重新写一次很是麻烦,现在我把它只做了一个自定义控件,可以配置清除按钮.密码可见小眼睛是否显示以及图标,有渐隐渐显和横向移动动画,不知道怎么上传可以直接观看的视频,附上三张效果图,可以点击链接观看视频是否是你想要的效果.   一.自定义控件ClearEditText 我的这个自带清除.小眼睛的控件,是一个自定义控件,控件名称ClearEditTe

随机推荐