热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android带有删除按钮的EditText

这篇文章主要介绍了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如下:

 
 
   
   
    
    
   

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


推荐阅读
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 本文介绍如何使用布局文件在Android应用中排列多行TextView和Button,使其占据屏幕的特定比例,并提供示例代码以帮助理解和实现。 ... [详细]
  • 本文介绍了Android开发中Intent的基本概念及其在不同Activity之间的数据传递方式,详细展示了如何通过Intent实现Activity间的跳转和数据传输。 ... [详细]
  • 优化 Android 按钮状态下的背景和文本颜色变化
    本文介绍如何通过 Android 的 Selector 实现按钮在不同状态下(如按压)的背景和文本颜色动态变化。我们将详细讲解实现步骤,并提供完整的代码示例。 ... [详细]
  • 本文详细介绍超文本标记语言(HTML)的基本概念与语法结构。HTML是构建网页的核心语言,通过标记标签描述页面内容,帮助开发者创建结构化、语义化的Web页面。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 本文探讨了在通过 API 端点调用时,使用猫鼬(Mongoose)的 findOne 方法总是返回 null 的问题,并提供了详细的解决方案和建议。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 本文探讨了在Windows Server 2008环境下配置Tomcat使用80端口时遇到的问题,包括端口被占用、多项目访问失败等,并提供详细的解决方法和配置建议。 ... [详细]
  • 本文详细介绍了Java Web应用程序中的过滤器(Filter)功能,包括其作用、实现方式及配置方法。过滤器可以在请求到达目标资源之前对其进行预处理,并在响应返回给客户端之前进行后处理。 ... [详细]
  • 本文介绍了多个关于JavaScript的书籍资源、实用工具和编程实例,涵盖从入门到进阶的各个阶段,帮助读者全面提升JavaScript编程能力。 ... [详细]
  • 分享一个简化版的Silverlight链接图项目:Link Map Simplified
    本文介绍了一个使用Silverlight开发的可视化工具,主要用于展示和操作复杂的实体关系图(Graph)。该工具在犯罪调查系统中得到了广泛应用,帮助用户直观地获取和理解相关信息。 ... [详细]
  • 探讨如何从数据库中按分组获取最大N条记录的方法,并分享新年祝福。本文提供多种解决方案,适用于不同数据库系统,如MySQL、Oracle等。 ... [详细]
  • 本文介绍了ArcXML配置文件的分类及其在不同服务中的应用,详细解释了地图配置文件的结构和功能,包括其在Image Service、Feature Service以及ArcMap Server中的使用方法。 ... [详细]
author-avatar
默默-晶f
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有