Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱
MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina.com

自定义View 可清除内容、设置图标、下划线的输入框 MD


目录

案例

  1. <com.bqt.lock.ClearEditText
  2. android:layout_width="match_parent"
  3. android:layout_height="50dp"
  4. android:background="@null"
  5. android:drawableBottom="@drawable/shape_line"
  6. android:drawableLeft="@drawable/icon"
  7. android:maxLines="2"
  8. android:textSize="14sp"/>
  9. <com.bqt.lock.ClearEditText
  10. android:layout_width="match_parent"
  11. android:layout_height="30dp"
  12. android:layout_marginTop="10dp"
  13. android:background="#00f"
  14. android:drawableBottom="@drawable/shape_line"
  15. android:drawableLeft="@drawable/icon"
  16. android:drawablePadding="10dp"
  17. android:maxLength="10"
  18. android:maxLines="1"
  19. android:textSize="13sp"/>

ClearEditText

  1. public class ClearEditText extends AppCompatEditText implements View.OnFocusChangeListener, TextWatcher {
  2. private Drawable leftIconDrawable;//左侧的一般为输入内容的指示图标
  3. private Drawable bottomLineDrawable;//右侧为清空内容的图标
  4. private Drawable rightClearDrawable;//下侧为下划线
  5. private int size;
  6. public ClearEditText(Context context) {
  7. this(context, null);
  8. }
  9. public ClearEditText(Context context, AttributeSet attrs) {
  10. this(context, attrs, android.R.attr.editTextStyle);
  11. }
  12. public ClearEditText(Context context, AttributeSet attrs, int defStyle) {
  13. super(context, attrs, defStyle);
  14. init(context);
  15. }
  16. private void init(Context context) {
  17. // 获取EditText的DrawableRight,假如没有设置我们就使用默认的图片
  18. rightClearDrawable = getCompoundDrawables()[2] == null ? getResources().getDrawable(R.drawable.icon_clean) : getCompoundDrawables()[2];
  19. leftIconDrawable = getCompoundDrawables()[0];
  20. bottomLineDrawable = getCompoundDrawables()[3];
  21. setOnFocusChangeListener(this);
  22. addTextChangedListener(this);
  23. }
  24. @Override
  25. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  26. super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  27. //如果设置了【drawableBottom】,则【drawableRight】的最大高度为【控件的高度 - drawableBottom的高度 - drawablePadding】
  28. int usedHeight = bottomLineDrawable != null ? bottomLineDrawable.getIntrinsicHeight() * 2 + getCompoundDrawablePadding() : 0;
  29. size = getMeasuredHeight() - usedHeight;
  30. Log.i("bqt", "【Drawable的宽高为】" + size);
  31. rightClearDrawable.setBounds(0, 0, size, size);
  32. if (leftIconDrawable != null) {
  33. leftIconDrawable.setBounds(0, 0, size, size);
  34. }
  35. setClearIconVisible(getText().length() > 0 && hasFocus());
  36. }
  37. /**
  38. * 因为我们不能直接给EditText设置点击事件,所以我们用记住我们按下的位置来模拟点击事件 当我们按下的位置 在 EditText的宽度 -
  39. * 图标到控件右边的间距 - 图标的宽度 和 EditText的宽度 - 图标到控件右边的间距之间我们就算点击了图标,竖直方向没有考虑
  40. */
  41. @Override
  42. public boolean onTouchEvent(MotionEvent event) {
  43. if (getCompoundDrawables()[2] != null
  44. && event.getAction() == MotionEvent.ACTION_UP
  45. && event.getX() >= (getWidth() - getPaddingRight() - size)
  46. && (event.getX() <= (getWidth() - getPaddingRight()))) {
  47. this.setText("");
  48. }
  49. return super.onTouchEvent(event);
  50. }
  51. /**
  52. * 当ClearEditText焦点发生变化的时候,判断里面字符串长度设置清除图标的显示与隐藏
  53. */
  54. @Override
  55. public void onFocusChange(View v, boolean hasFocus) {
  56. if (hasFocus) {
  57. setClearIconVisible(getText().length() > 0);
  58. } else {
  59. setClearIconVisible(false);
  60. }
  61. }
  62. /**
  63. * 设置清除图标的显示与隐藏,调用setCompoundDrawables为EditText绘制上去
  64. */
  65. protected void setClearIconVisible(boolean visible) {
  66. setCompoundDrawables(leftIconDrawable, getCompoundDrawables()[1], visible ? rightClearDrawable : null, bottomLineDrawable);
  67. }
  68. @Override
  69. public void onTextChanged(CharSequence s, int start, int count, int after) {
  70. }
  71. @Override
  72. public void beforeTextChanged(CharSequence s, int start, int count, int after) {
  73. }
  74. @Override
  75. public void afterTextChanged(Editable s) {
  76. setClearIconVisible(s.length() > 0 && hasFocus());
  77. }
  78. }

下划线

这种方式比单独加一个控件显示分割线更优雅一些

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android">
  3. <solid android:color="#D4D4D4"/>
  4. <size
  5. android:width="1000dp"
  6. android:height="1dp"/>
  7. </shape>

2018-10-13

自定义View 可清除内容、设置图标、下划线的输入框 MD的更多相关文章

  1. 2019-10-16-WPF-控件-Content-的内容不显示下划线字符串

    title author date CreateTime categories WPF 控件 Content 的内容不显示下划线字符串 lindexi 2019-10-16 09:21:32 +080 ...

  2. Android-TabLayout设置内容宽度以及下划线宽度

    默认图: 效果图: 项目中使用到需要像今日头条那种实现顶部横向滑动标题功能,本人项目中使用TabLayout+ViewPager实现,但是,实现后默认的TabLayout间距特别大,并且下划线,文字大 ...

  3. NSAttributedString能否设置文字下划线?是否支持line break?

    #import <CoreText/CoreText.h> #import "ViewController.h" @interface ViewController ( ...

  4. 设置TextView下划线并响应点击事件(SpannableString)

    下面是一个20行的完整Demo代码:基本原理是使用一个SpannableString并设置其ClickableSpan来响应点击事件. TextView useInfo = (TextView) fi ...

  5. $Django 多对多-自定义第三张表 基于双下划线的跨表查询(补充)

    自定义第三张表的好处:可以定义多个字段, 缺点:查询不方便(有方法解决) 1.第三张表设置外键,联合唯一(查询不方便) class Books(models.Model): name=models.C ...

  6. 自定义View实现钟摆效果进度条PendulumView

    转载请注明出处:http://blog.csdn.net/fightlei/article/details/52556755 在网上看到了一个IOS组件PendulumView,实现了钟摆的动画效果. ...

  7. 【朝花夕拾】Android自定义View篇之(二)Canvas常用功能

    前言 转在请申明,转自[https://www.cnblogs.com/andy-songwei/p/10960012.html],谢谢! 上一篇讲View的绘制流程中讲到过,最后一步是draw流程, ...

  8. Android 自定义View及其在布局文件中的使用示例(三):结合Android 4.4.2_r1源码分析onMeasure过程

    转载请注明出处 http://www.cnblogs.com/crashmaker/p/3549365.html From crash_coder linguowu linguowu0622@gami ...

  9. 利用自定义View实现扫雷游戏

    游戏规则: 简单版的扫雷事实上就是一个9×9的矩阵,其中有十个点是雷,非雷方块的数字代表该方块周围八个方块中雷的个数.通过长按某一方块(方块会变红)认定该方块为玩家认为的雷,通过短按某一方块来“展开” ...

随机推荐

  1. 懒人的福利?教你用set维护斜率优化凸包

    斜率优化题目大家肯定都做得不少了,有一些题目查询插入点的x坐标和查询斜率都不单调,这样就需要维护动态凸包并二分斜率.(例如bzoj1492) 常规的做法是cdq分治或手写平衡树维护凸包,然而如果我不愿 ...

  2. BZOJ.3990.[SDOI2015]排序(DFS)

    题目链接 操作序列的顺序显然是无关的,所以只需按特定顺序求出一个长度为\(l\)的操作序列,它对答案的贡献为\(l!\). 我们从小到大枚举所有选择.若当前为第\(i\)个,如果有一段长度为\(2^i ...

  3. bzoj 4000 矩阵快速幂优化DP

    建立矩阵,跑快速幂 /************************************************************** Problem: 4000 User: idy002 ...

  4. 【转载】EmptyWorkingSet 程序运行内存整清理

    网络上找了很多关于内存整理的文章,不外乎都是使用EmptyWorkingSet来实现.就如下面这段代码. #include "stdafx.h"#include <windo ...

  5. rsync使用sudo权限

    1.在etc/sudoers增加,比如www-data这个账户的 www-data ALL=NOPASSWD:/usr/bin/rsync 2.使用时增加--rsync-path="sudo ...

  6. 从零开始部署CAS服务器

    从0开始部署CAS服务器的操作过程文档,我已经整理完毕,一共分为8步,这8步都是我自己操作实践过的. Setp1:Ubuntu server安装 在virtual box中安装ubuntu serve ...

  7. 自定义两行可左右滑动的GridView

    效果图: xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:an ...

  8. 该对象尚未初始化。请确保在所有其他初始化代码后面的应用程序启动代码中调用 HttpConfiguration.EnsureInitialized()。

    WebAPI使用属性路由,配置config.MapHttpAttributeRoutes();后出现错误: System.InvalidOperationException: 该对象尚未初始化.请确保 ...

  9. Win10系统下如何禁止同步主机session?windows 10禁止同步主机session的方法

    近来,有些刚刚升级Win10正式版的用户反映自己的电脑开机时有个同步主机session启动项占用了将近半分钟,而选择用360禁止后,下次会出现同步主机session3,再禁止下次又会出现同步主机ses ...

  10. What is the largest TCP/IP network port number allowable for IPv4

    69 down vote The largest port number is an unsigned short 2^16-1: 65535 A registered port is one ass ...