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

Android自定义控件EditText使用详解

这篇文章主要为大家详细介绍了Android自定义控件EditText的使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Android自定义控件EditText的具体代码,供大家参考,具体内容如下

自定义控件分三种:

1. 自绘控件
2. 组合控件
3. 继承控件

代码已上传到 github
以后的自定义控件就都放这个仓库

需求

这里由于项目的需要实现一个自定义EditText,主要实现的为两点,一个是工具图标toolIcon,例如点击清除EditText内容。一个为EditText左边的提示图标hintIcon, 例如输入账号密码时前面的图标。

为了让这个控件的拓展性更高,设置了两个点击事件接口。对于toolIcon来说,默认点击事件为清除EditText内容,如果需要更改,在代码中设设置相关的点击事件即可。

步骤

继承EditText
编写attrs.xml, 创建declare-styleable
编写MyEditText
布局中使用

实现

获取布局文件中设置的属性

这里返回的是一个TypedArray数组,获取之后就可以获得布局文件中设置的属性了

private void init(Context context, AttributeSet attrs) {
  TypedArray typedArray = context.getTheme().obtainStyledAttributes(
    attrs,
    R.styleable.MyEditText,
    0, 0);

  hintIcon = typedArray.getDrawable(R.styleable.MyEditText_hintIcon);
  toolIcon = typedArray.getDrawable(R.styleable.MyEditText_toolIcon);
  fixed = typedArray.getBoolean(R.styleable.MyEditText_fixed, true);

  if (toolIcon != null && fixed) {
   setHeight(toolIcon.getIntrinsicHeight());
  }

  setCompoundDrawablesWithIntrinsicBounds(hintIcon, null, null, null);

  setCompoundDrawablePadding(10);

  typedArray.recycle();

  OnClickListenerWithEditTextToolIcon= new OnClickListenerWithEditTextToolIcon() {
   @Override
   public void onClick() {
    setText("");
   }
  };
 }

设置资源图片

EditText是继承自TextView,在TextView中存在两个方法

setCompoundDrawablesWithIntrinsicBounds(left, top, right, bottom)
setCompoundDrawables(left, top, right, bottom)

是设置资源图片的位置,第一个方法和第二个方法的区别在于第一个方法中资源图片的大小是由系统来获取图片固有的大小,第二个方法则是需要自己通过LayoutParams设置大小。

设置点击事件

我们通过setCompoundDrawables()等方法设置的图片,而由于在父类中并没有提供相关的图片点击处理接口,因此可以重写onTouchEvent()来实现相关的点击事件,只需要根据我们手指落点或抬起点的位置就可以判断手指是否点击了相关图片。在这里,我选择了手指抬起时处理

/**
  * Override the touchEvent to judge whether click toolIcon or hintIcon
  *
  * @param event motionEvent
  * @return super
  */
 @Override
 public boolean onTouchEvent(MotionEvent event) {

  if (event.getAction() == MotionEvent.ACTION_UP) {
   if (hintIcon != null) {
    if (event.getX()  0) {
     if (getCompoundDrawables()[0] != null
       && onClickListenerWithEditTextHintIcon != null) {
      onClickListenerWithEditTextHintIcon.onClick();
     }
    }
   }

   if (toolIcon != null) {
    if (event.getX() > (getWidth()
      - toolIcon.getIntrinsicWidth())
      && event.getX() 

完整代码

package com.customwidget.lzqwidget.cuswidget;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.EditText;

import com.customwidget.lzqwidget.R;

/**
 * Custom widget of EditText with two icon.
 * Created by lizhongquan on 16-1-6.
 */
public class MyEditText extends EditText {

 private Drawable hintIcon = null;
 private Drawable toolIcon = null;

 /**
  * HintIcon clickListener
  */
 private OnClickListenerWithEditTextHintIcon OnClickListenerWithEditTextHintIcon= null;

 /**
  * Default clear the EditText
  */
 private OnClickListenerWithEditTextToolIcon OnClickListenerWithEditTextToolIcon= null;

 /**
  * Default fixed the Height
  */
 private boolean fixed = true;

 public MyEditText(Context context) {
  super(context);
 }

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

 public MyEditText(Context context, AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
  init(context, attrs);
 }

 private void init(Context context, AttributeSet attrs) {
  TypedArray typedArray = context.getTheme().obtainStyledAttributes(
    attrs,
    R.styleable.MyEditText,
    0, 0);

  hintIcon = typedArray.getDrawable(R.styleable.MyEditText_hintIcon);
  toolIcon = typedArray.getDrawable(R.styleable.MyEditText_toolIcon);
  fixed = typedArray.getBoolean(R.styleable.MyEditText_fixed, true);

  if (toolIcon != null && fixed) {
   setHeight(toolIcon.getIntrinsicHeight());
  }

  setCompoundDrawablesWithIntrinsicBounds(hintIcon, null, null, null);

  setCompoundDrawablePadding(10);

  typedArray.recycle();

  OnClickListenerWithEditTextToolIcon= new OnClickListenerWithEditTextToolIcon() {
   @Override
   public void onClick() {
    setText("");
   }
  };
 }

 /**
  * Override the touchEvent to judge whether click toolIcon or hintIcon
  *
  * @param event motionEvent
  * @return super
  */
 @Override
 public boolean onTouchEvent(MotionEvent event) {

  if (event.getAction() == MotionEvent.ACTION_UP) {
   if (hintIcon != null) {
    if (event.getX()  0) {
     if (getCompoundDrawables()[0] != null
       && onClickListenerWithEditTextHintIcon != null) {
      onClickListenerWithEditTextHintIcon.onClick();
     }
    }
   }

   if (toolIcon != null) {
    if (event.getX() > (getWidth()
      - toolIcon.getIntrinsicWidth())
      && event.getX()  0 && getCompoundDrawables()[2] == null && toolIcon != null) {
//   hintIcon.setBounds(10, 0, 10, 0);
   setCompoundDrawablesWithIntrinsicBounds(hintIcon, null, toolIcon, null);
  }

  if (text.length() == 0 && getCompoundDrawables()[2] != null && toolIcon != null) {
   setCompoundDrawablesWithIntrinsicBounds(hintIcon, null, null, null);
  }
 }

 /**
  * interface when click hintIcon
  */
 public interface OnClickListenerWithEditTextHintIcon {
  void onClick();
 }

 /**
  * interface when click toolIcon
  */
 public interface OnClickListenerWithEditTextToolIcon {
  void onClick();
 }
}

attrs.xml:

<&#63;xml version="1.0" encoding="utf-8"&#63;>


 
  
  
  
 


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


推荐阅读
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 解决微信电脑版无法刷朋友圈问题:使用安卓远程投屏方案
    在工作期间想要浏览微信和朋友圈却不太方便?虽然微信电脑版目前不支持直接刷朋友圈,但通过远程投屏技术,可以轻松实现在电脑上操作安卓设备的功能。 ... [详细]
  • 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]
  • 本文深入探讨了 com.example.android.sunshine.data.TestUtilities 中 validateThenCloseCursor() 方法的使用方法及其代码示例,旨在帮助开发者更好地理解和应用该方法。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • 本报告涵盖了个人博客账号和码云账号的注册过程,以及对网络工程专业学习的反思与展望。通过回顾初入大学时的专业选择,分析当前的专业知识和技能水平,并对未来的职业规划进行了详细讨论。 ... [详细]
  • 本文详细介绍了 com.facebook.drawee.view.SimpleDraweeView 中的 setScaleType 方法,提供了多个实际代码示例,并解释了其在不同场景下的应用。 ... [详细]
  • libsodium 1.0.15 发布:引入重大不兼容更新
    最新发布的 libsodium 1.0.15 版本带来了若干不兼容的变更,其中包括默认密码散列算法的更改和其他重要调整。 ... [详细]
  • 本文详细记录了在银河麒麟操作系统和龙芯架构上使用 Qt 5.15.2 进行项目打包时遇到的问题及解决方案,特别关注于 linuxdeployqt 工具的应用。 ... [详细]
  • VSCode与Gitee集成:项目提交的高效实践
    本文介绍如何利用VSCode内置的Git工具将项目提交到Gitee,简化Git命令的使用,提升代码管理效率。同时分享一些常见的踩坑经验和解决方案。 ... [详细]
  • 本文详细介绍了如何在ECharts中使用线性渐变色,通过echarts.graphic.LinearGradient方法实现。文章不仅提供了完整的代码示例,还解释了各个参数的具体含义及其应用场景。 ... [详细]
author-avatar
mobiledu2502869373
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有