仿知乎登陆邮箱自动补全,邮箱补全

项目要求:

登陆界面输入邮箱,自动匹配常用邮箱并自动补全后缀。

比如邮箱为10376129@qq.com,当我输入10376129@q时,输入框自动补全后面的q.com且颜色为灰浅色,输入框失去焦点时,补全q.com颜色变为黑色,和前面103796129@q的颜色一致。

解决:

1.通过查看知乎的布局,发现没有用自定义控件,仅仅用了普通的EditText。

2.查看EditTex(继承TextView)t的API,最终想到了用下面这个方法

void android.widget.TextView.setCompoundDrawables(Drawable left,Drawable

top, Drawable right,

Drawable bottom)

通过绘制EditText右边的Drawable来显示需要自动补全的字符串

3.演示

4.关键代码

package com.lt.autoemailactivity;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import android.app.Activity;

import android.graphics.Bitmap;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.Rect;

import android.graphics.drawable.BitmapDrawable;

import android.graphics.drawable.Drawable;

import android.os.Bundle;

import android.text.Editable;

import android.text.TextWatcher;

import android.view.View;

import android.view.View.OnFocusChangeListener;

import android.widget.EditText;

public class AutoCompleteEditTextActivity extends Activity implements

TextWatcher {

/**

* 邮箱EditText

*/

private EditText mEmailEditText;

/**

* 常用的邮箱

*/

private HashMap mAutoData = new HashMap();

/**

* 邮箱editText的高度

*/

private int mHeight;

/**

* 邮箱editText的宽度

*/

private int mWidth;

/**

* 输入框中字符的baseLine

*/

private int baseLine;

/**

* 画笔

*/

private Paint mPaint;

private Bitmap mBitmap;

/**

* 画布

*/

private Canvas canvas;

private Drawable drawable;

/**

* 后缀字符串

*/

private String mAddedText = "";

/**

* 记录是否为空

*/

private boolean mFlag;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_auto_complete_edittext);

initEmail();

mEmailEditText = (EditText) findViewById(R.id.email);

mEmailEditText.addTextChangedListener(this);

mEmailEditText.setOnFocusChangeListener(new OnFocusChangeListener() {

@Override

public void onFocusChange(View v, boolean hasFocus) {

if (!hasFocus) {

mEmailEditText.append(mAddedText);

}

}

});

}

@Override

public void beforeTextChanged(CharSequence s, int start, int count,

int after) {

}

@Override

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

}

@Override

public void afterTextChanged(Editable s) {

String text = s.toString();

mFlag = true;

Iterator> iterator = mAutoData.entrySet()

.iterator();

// 遍历常用邮箱

while (iterator.hasNext()) {

Map.Entry entry = iterator.next();

if (text.endsWith(entry.getKey())) {

drawAddedText(entry.getValue());

mAddedText = entry.getValue();

mFlag = false;

break;

}

}

// 如果没有匹配,就画一个空

if (mFlag) {

drawAddedText("");

mAddedText = "";

}

}

/**

* 画出后缀字符串

*

* @param addedText

*/

private void drawAddedText(String addedText) {

// 如果字符串为空,画空

if (addedText.equals("")) {

mEmailEditText.setCompoundDrawables(null, null, null, null);

return;

}

// 只需要初始化一次

if (mBitmap == null) {

mHeight = mEmailEditText.getHeight();

mWidth = mEmailEditText.getWidth();

// 初始化画笔

mPaint = new Paint();

mPaint.setColor(Color.GRAY);

mPaint.setAntiAlias(true);// 去除锯齿

mPaint.setFilterBitmap(true);// 对位图进行滤波处理

mPaint.setTextSize(mEmailEditText.getTextSize());

}

// 计算baseLine

Rect rect = new Rect();

int baseLineLocation = mEmailEditText.getLineBounds(0, rect);

baseLine = baseLineLocation - rect.top;

// 添加的字符窜的长度

int addedTextWidth = (int) (mPaint.measureText(addedText) + 1);

// 创建bitmap

mBitmap = Bitmap.createBitmap(addedTextWidth, mHeight,

Bitmap.Config.ARGB_8888);

canvas = new Canvas(mBitmap);

// 绘制后缀字符串

canvas.drawText(addedText, 0, baseLine, mPaint);

// bitmap转化为Drawable

drawable = new BitmapDrawable(mBitmap);

String text = mEmailEditText.getText().toString();

// 计算后缀字符串在输入框中的位置

int addedTextLeft = (int) (mPaint.measureText(text) - mWidth + addedTextWidth);

int addedTextRight = addedTextLeft + addedTextWidth;

int addedTextTop = 0;

int addedTextBottom = addedTextTop + mHeight;

// 设置后缀字符串位置

drawable.setBounds(addedTextLeft, addedTextTop, addedTextRight,

addedTextBottom);

// 显示后缀字符串

mEmailEditText.setCompoundDrawables(null, null, drawable, null);

}

/**

* 初始化常用的邮箱

*/

private void initEmail() {

mAutoData.put("@q", "q.com");

mAutoData.put("@qq", ".com");

mAutoData.put("@qq.", "com");

mAutoData.put("@qq.c", "om");

mAutoData.put("@qq.co", "m");

mAutoData.put("@1", "63.com");

mAutoData.put("@16", "3.com");

mAutoData.put("@163", ".com");

mAutoData.put("@163.", "com");

mAutoData.put("@163.c", "om");

mAutoData.put("@163.co", "m");

mAutoData.put("@s", "ina.cn");

mAutoData.put("@si", "na.cn");

mAutoData.put("@sin", "a.cn");

mAutoData.put("@sina", ".cn");

mAutoData.put("@sina.", "cn");

mAutoData.put("@sina.c", "n");

mAutoData.put("@s", "ina.com");

mAutoData.put("@si", "na.com");

mAutoData.put("@sin", "a.com");

mAutoData.put("@sina", ".com");

mAutoData.put("@sina.", "com");

mAutoData.put("@sina.c", "om");

mAutoData.put("@sina.co", "m");

mAutoData.put("@1", "26.com");

mAutoData.put("@12", "6.com");

mAutoData.put("@126", ".com");

mAutoData.put("@126.", "com");

mAutoData.put("@126.c", "om");

mAutoData.put("@126.co", "m");

}

}

5.源码下载(有注释)

http://download.csdn.net/detail/a15501628162/8412245

http://www.dengb.com/Androidjc/951358.htmlwww.dengb.comtruehttp://www.dengb.com/Androidjc/951358.htmlTechArticle仿知乎登陆邮箱自动补全,邮箱补全 项目要求: 登陆界面输入邮箱,自动匹配常用邮箱并自动补全后缀。 比如邮箱为10376129@qq.com,当我输...

android 邮箱 知乎,仿知乎登陆邮箱自动补全,邮箱补全相关推荐

  1. android仿知乎按钮动效,Android仿知乎客户端关注和取消关注的按钮点击特效实现思路详解...

    先说明一下,项目代码已上传至github,不想看长篇大论的也可以先去下代码,对照代码,哪里不懂点哪里. 代码在这https://github.com/zgzczzw/ZHFollowButton 前几 ...

  2. Android 仿知乎创意广告

    代码地址如下: http://www.demodashi.com/demo/14904.html ###一.概述 貌似前段时间刷知乎看到的一种非常有特色的广告展现方式,即在列表页,某一个Item显示背 ...

  3. 高仿知乎android,Android高仿知乎首页Behavior

    Android自定义Behavior实现跟随手势滑动,显示隐藏标题栏.底部导航栏及悬浮按钮 Android Design包下的CoordinatorLayout是相当重要的一个控件,它让许多动画的实现 ...

  4. github android 开源,Android github开源项目学习之—仿知乎APP(一)

    前言 (本人菜鸟,如有错误请指正) 一直奇怪网上说的Recycler让自己定制点击事件是怎么回事,看了这个大牛的仿知乎 Android客户端源码才知道,他是这样做的-- 写了一个RecyclerVie ...

  5. android 如何学习开源项目,Android github开源项目学习之—仿知乎APP(一)

    前言 (本人菜鸟,如有错误请指正) 一直奇怪网上说的Recycler让自己定制点击事件是怎么回事,看了这个大牛的仿知乎 Android客户端源码才知道,他是这样做的-- 写了一个RecyclerVie ...

  6. 仿知乎日报android

    刚开始接触android,就拿着知乎日报做实验品了, 大概写了有三天了,基本首屏功能完成了:开始时候连baseAdapter都不会写, 现在也大概了解了几个功能,扯上几个android的组件了 侧边栏 ...

  7. Koa 2 基础(仿知乎)

    Koa 2 基础 接口文档 Postman仿知乎在线测试 REST 简介 REST是什么 REST是Resource Representational State Transfer的缩写,是一种Web ...

  8. 仿知乎客户端的白天黑夜主题切换

    仿知乎客户端的白天黑夜主题切换 转载请注明出处 作者:AboutJoke ( http://blog.csdn.net/u013200308 ) 原文链接:http://blog.csdn.net/u ...

  9. 杀了一个程序员祭天换来今天的正常推送:仿知乎APP源码分享

    原创 2017-09-19 菜鸟君 菜鸟窝官网 ▲点击上方蓝色字体关注后免费领取"200套开源项目" 菜鸟窝技术文章编辑招募中,可免费学习优秀实战课程,有兴趣快加菜鸟君微信:kee ...

最新文章

  1. Concrete Math 混凝土数学(具体数学)随笔
  2. 使用 dispatchEvent() 方法
  3. DDP、DDU、DAP的区别你都知道吗?
  4. 【转】Unity3d:读取FBX中的动画
  5. 最新!北京电影学院成立“翟天临事件”调查组
  6. Opencv---remap函数的实现
  7. 关于类模版迭代器提出时的错误
  8. 郁金香VC外挂教程(全) 翻录版 免Key(精品教程)
  9. anaconda使用pythonnotebook_anaconda3 notebook for python数据分析-环境搭建
  10. hadoop常见问题汇总
  11. 洛谷P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold
  12. jQuery 5 条件选择器
  13. matlab信号探测,雷达信号检测matlab程序
  14. 错误代码105是什么意思
  15. WEB漏洞攻防 -根据不同数据库类型之间的差异性进行注入
  16. 计算机的色彩在哪调整w10,win10电脑色彩太冷怎么调节屏幕色彩
  17. 简单解释计算机内存与外存的关系,内存和外存概念的严格解析
  18. 使用curl工具通过Gopher协议发送GET请求
  19. 键盘与电脑识别问题?
  20. 天线测试常见问题汇总和解答

热门文章

  1. 公众号jdk 获取手机号_公众号免费留言/评论功能获取步骤
  2. WordPress主题制作进阶#10自定义主页
  3. FIL冲上24小时涨幅榜第一,受此利好影响最大的是DMC
  4. 自动化_超前和滞后补偿
  5. 双电阻差分电流采样_利用采样保持放大器和RF ADC从根本上扩展带宽以突破X波段频率...
  6. VMware发布开源项目Lightwave和Photon 提高云应用扩展性
  7. 数据结构--Tire树
  8. python怎么读取pdf为文本_轻松用Python批量提取PDF文本内容,这个小技巧告诉你!...
  9. MAVEN项目报错:An internal error occurred during: Updating Maven Project java.lang.NullPoint
  10. 基于LPP算法实现MNIST数据集降维