文档章节

EditText实现日期设置,附带删除键

 易水寒521
发布于 2015/06/23 16:34
字数 728
阅读 169
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

package com.example.traindemo.util;
import java.util.Calendar;
import com.example.traindemo.R;
import android.app.DatePickerDialog;
import android.content.Context;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.DatePicker;
import android.widget.EditText;
/**
 * @2014-12-09 10:58:24
 * @author lxg
 * 
 */
public class EditTextWithDate extends EditText {
 private final static String TAG = "EditTextWithDate";
 private Drawable dateIcon;
 private Context mContext;
 private Calendar c;
 private int mYear;
 private int mMonth;
 private int mDay;
 private boolean datePickerEnabled = true;
 public EditTextWithDate(Context context) {
  super(context);
  mContext = context;
  init();
 }
 public EditTextWithDate(Context context, AttributeSet attrs) {
  super(context, attrs);
  mContext = context;
  init();
 }
 public EditTextWithDate(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
  mContext = context;
  init();
 }
 private void init() {
  dateIcon = mContext.getResources().getDrawable(R.drawable.ic_launcher);
  dateIcon.setBounds(-11, 0, 70, 70);
  setCompoundDrawables(null, null, dateIcon, null);
  // setCompoundDrawablesWithIntrinsicBounds(null, null, dateIcon, null);
  c = Calendar.getInstance();
  final Calendar cal = Calendar.getInstance();
  mYear = cal.get(Calendar.YEAR); // 获取当前年份
  mMonth = cal.get(Calendar.MONTH);// 获取当前月份
  mDay = cal.get(Calendar.DAY_OF_MONTH);// 获取当前月份的日期号码
  this.setEnabled(false);
 }
 @Override
 public boolean onTouchEvent(MotionEvent event) {
  if (dateIcon != null && event.getAction() == MotionEvent.ACTION_UP) {
   int eventX = (int) event.getRawX();
   int eventY = (int) event.getRawY();
   Log.e(TAG, "eventX = " + eventX + "; eventY = " + eventY);
   Rect rect = new Rect();
   getGlobalVisibleRect(rect);
   rect.left = rect.right - 81;
   if (rect.contains(eventX, eventY)) {
    if (datePickerEnabled) {
     new DatePickerDialog(mContext,
       new DatePickerDialog.OnDateSetListener() {
        public void onDateSet(DatePicker view,
          int year, int monthOfYear,
          int dayOfMonth) {
         mYear = year;
         mMonth = monthOfYear;
         mDay = dayOfMonth;
         setText(new StringBuilder().append("")
           .append(mYear).append("-")
           .append(mMonth + 1).append("-")
           .append(mDay).append(""));
        }
       }, c.get(Calendar.YEAR), c.get(Calendar.MONTH),
       c.get(Calendar.DAY_OF_MONTH)).show();
    }
   }
  }
  return super.onTouchEvent(event);
 }
 public boolean isDatePickerEnabled() {
  return datePickerEnabled;
 }
 public void setDatePickerEnabled(boolean datePickerEnabled) {
  this.datePickerEnabled = datePickerEnabled;
  if (!datePickerEnabled) {
   setText("");
  }
 }
}
自定义带删除功能的EditText
package com.example.view;
import com.example.ui.R;
import android.content.Context;
import android.graphics.Rect;
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.widget.EditText;
import android.widget.Toast;
import android.view.View.OnFocusChangeListener;;
public class EditTextWithDelete extends EditText implements OnFocusChangeListener{
private Drawable imgEnable;
private Context context;
 
public EditTextWithDelete(Context context) {
super(context);
this.context = context;
init();
public EditTextWithDelete(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.context = context;
init();
}
public EditTextWithDelete(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
init();
}
 
private void init() {
//获取图片资源
imgEnable = context.getResources().getDrawable(R.drawable.delete);
addTextChangedListener(new TextWatcher() {
 
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {

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

public void afterTextChanged(Editable s) {
setDrawable();
Toast.makeText(context, getText(), 10).show();
}
});
setDrawable();
}
 
/**
* 设置删除图片
*/
private void setDrawable() {
if(length() == 0) {
setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);
}else {
setCompoundDrawablesWithIntrinsicBounds(null, null, imgEnable, null);
}
} 
/**
* event.getX() 获取相对应自身左上角的X坐标
* event.getY() 获取相对应自身左上角的Y坐标
* getWidth() 获取控件的宽度
* getTotalPaddingRight() 获取删除图标左边缘到控件右边缘的距离
* getPaddingRight() 获取删除图标右边缘到控件右边缘的距离
* getWidth() - getTotalPaddingRight() 计算删除图标左边缘到控件左边缘的距离
* getWidth() - getPaddingRight() 计算删除图标右边缘到控件左边缘的距离
*/

public boolean onTouchEvent(MotionEvent event) {
if(imgEnable != null && event.getAction() == MotionEvent.ACTION_UP) {
int x = (int) event.getX() ;
//判断触摸点是否在水平范围内
boolean isInnerWidth = (x > (getWidth() - getTotalPaddingRight())) &&
(x < (getWidth() - getPaddingRight()));
//获取删除图标的边界,返回一个Rect对象
Rect rect = imgEnable.getBounds();
//获取删除图标的高度
int height = rect.height();
int y = (int) event.getY();
//计算图标底部到控件底部的距离
int distance = (getHeight() - height) /2;
//判断触摸点是否在竖直范围内(可能会有点误差)
//触摸点的纵坐标在distance到(distance+图标自身的高度)之内,则视为点中删除图标
boolean isInnerHeight = (y > distance) && (y < (distance + height));
 
if(isInnerWidth && isInnerHeight) {
setText("");
}
 
}
 
return super.onTouchEvent(event);
}

@Override
protected void finalize() throws Throwable {
super.finalize();
}
@Override
public void onFocusChange(View v, boolean hasFocus) {
if(hasFocus) {
setDrawable();
}else {
setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);
}
}
 
}

 

 

 

粉丝 1
博文 130
码字总数 120077
作品 0
虹口
私信 提问
加载中
请先登录后再评论。
Netty那点事(三)Channel与Pipeline

Channel是理解和使用Netty的核心。Channel的涉及内容较多,这里我使用由浅入深的介绍方法。在这篇文章中,我们主要介绍Channel部分中Pipeline实现机制。为了避免枯燥,借用一下《盗梦空间》的...

黄亿华
2013/11/24
2W
22
用vertx实现高吞吐量的站点计数器

工具:vertx,redis,mongodb,log4j 源代码地址:https://github.com/jianglibo/visitrank 先看架构图: 如果你不熟悉vertx,请先google一下。我这里将vertx当作一个容器,上面所有的圆圈要...

jianglibo
2014/04/03
4.3K
3
SQLServer实现split分割字符串到列

网上已有人实现sqlserver的split函数可将字符串分割成行,但是我们习惯了split返回数组或者列表,因此这里对其做一些改动,最终实现也许不尽如意,但是也能解决一些问题。 先贴上某大牛写的s...

cwalet
2014/05/21
9.7K
0
树莓派(Raspberry Pi):完美的家用服务器

自从树莓派发布后,所有在互联网上的网站为此激动人心的设备提供了很多有趣和具有挑战性的使用方法。虽然这些想法都很棒,但树莓派( RPi )最明显却又是最不吸引人的用处是:创建你的完美家用...

异次元
2013/11/09
7.6K
8
程序猿媛一:Android滑动翻页+区域点击事件

滑动翻页+区域点击事件 ViewPager+GrideView 声明:博文为原创,文章内容为,效果展示,思路阐述,及代码片段。文尾附注源码获取途径。 转载请保留原文出处“http://my.oschina.net/gluoyer...

花佟林雨月
2013/11/09
4.3K
1

没有更多内容

加载失败,请刷新页面

加载更多

使用旁路输出(side output)来拆分和复制流

  我们在处理数据的时候,有时候想对不同情况的数据进行不同的处理,那么就需要把流进行拆分或者复制。 如果是使用filter来进行拆分,也能满足我们的需求,但每次筛选都要保留整个流,然后...

osc_ct0tt1cu
57分钟前
18
0
Azure AD 与 AWS IAM 集成实现SSO—上(Azure部分)

整体的架构和流程是下面这个样子: Azure部分: 登录Azure的portal通过Azure Active Directory创建一个测试用户: 返回Azure Active Directory 创建新的应用程序 Amazon Web Service 搜索 Am...

osc_bgs3qxk5
59分钟前
0
0
Azure AD 与 AWS IAM 集成实现SSO—下(AWS部分)

再回顾一下架构,我们都要做什么,别乱: 看来在AWS上做的工作要多一些。 登录AWS控制台: 进入到IAM这个服务: 在配置提供程序中,选择SAML,提供商名称自定义,比如WAAD,将刚才下载的元数...

osc_ibuoui1c
今天
0
0
AWS DevOps 通过Config自动审计Security Group配置——上篇

这个实验的一个场景是,运维同事设计安全组Security Group的时候,打开了除了HTTP和HTTPS的入口访问权限。其他协议或端口如果打开,除了审计不通过的同时,会自动触发一个函数将它修改成我们...

osc_l330x9u1
今天
3
0
AWS DevOps 通过Config自动审计Security Group配置——下篇

再讲一下背景, 这个实验的一个场景是,运维同事设计安全组Security Group的时候,打开了除了HTTP和HTTPS的入口访问权限。其他协议或端口如果打开,除了审计不通过的同时,会自动触发一个函数...

osc_cudh2wh2
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部