RecipientsEditor-信息收件人输入框
首先说一下信息收件人这个类的继承关系
RecipientsEditor->EncapsulatedMTKRecipientEditTextView(这两个类都在mms目录下)
->MTKRecipientEditTextView(mediatek/frameworks-ext/ex/chips/src/com/android/ex/chips/)
->MultiAutoCompleteTextView->AutoCompleteTextView->EditText(frameworks/base/core/java/android/widget)
然后我们想要修改这个输入框的样式,包括里面的文字颜色、背景等。这个我们可以在MTKRecipientEditTextView 中进行设定,关键代码如下
private Bitmap createUnselectedChip(RecipientEntry contact, TextPaint paint,
boolean leaveBlankIconSpacer) {
// Ellipsize the text so that it takes AT MOST the entire width of the
// autocomplete text entry area. Make sure to leave space for padding
// on the sides.
int height = (int) mChipHeight;
int iconWidth = height;
float[] widths = new float[1];
paint.getTextWidths(" ", widths);
/// M: Limit ellipsizedText in some case (ex. moreChip)
CharSequence ellipsizedText = ellipsizeText(createChipDisplayText(contact), paint,
(mLimitedWidthForSpan == -1) ? (calculateAvailableWidth() - iconWidth - widths[0]) : (mLimitedWidthForSpan - iconWidth - widths[0]));
printDebugLog(TAG,"[createUnselectedChip] start, " + ellipsizedText + ", ID: " + contact.getContactId());
// Make sure there is a minimum chip width so the user can ALWAYS
// tap a chip without difficulty. /// M: Only leave space if icon exists. @{
boolean hasIcon = false;
int ellipsizedTextWidth = (int) Math.floor(paint.measureText(ellipsizedText, 0, ellipsizedText.length()));
int width = ellipsizedTextWidth + (mChipPadding * 2);
/// @} // Create the background of the chip.
Bitmap tmpBitmap = null;
Drawable background = getChipBackground(contact);
if (background != null) {
Canvas canvas = null; /// M: Only leave space if icon exists
Bitmap photo = null;
Matrix matrix = null; // Don't draw photos for recipients that have been typed in OR generated on the fly.
long contactId = contact.getContactId();
boolean drawPhotos = isPhoneQuery() ?
contactId != RecipientEntry.INVALID_CONTACT
: (contactId != RecipientEntry.INVALID_CONTACT
&& (contactId != RecipientEntry.GENERATED_CONTACT &&
!TextUtils.isEmpty(contact.getDisplayName())));
if (drawPhotos) {
byte[] photoBytes = contact.getPhotoBytes();
// There may not be a photo yet if anything but the first contact address
// was selected.
Trace.traceBegin(Trace.TRACE_TAG_VIEW, "getPhoto " + contact.getContactId());
if (photoBytes == null && contact.getPhotoThumbnailUri() != null) {
// TODO: cache this in the recipient entry?
((BaseRecipientAdapter) getAdapter()).fetchPhoto(contact, contact
.getPhotoThumbnailUri());
photoBytes = contact.getPhotoBytes();
}
Trace.traceEnd(Trace.TRACE_TAG_VIEW);
Trace.traceBegin(Trace.TRACE_TAG_VIEW, "decodePhoto");
if (photoBytes != null) {
/* Vanzo:zhangshuli on: Thu, 12 Mar 2015 11:48:23 +0000
photo = BitmapFactory.decodeByteArray(photoBytes, 0, photoBytes.length);
*/
// End of Vanzo: zhangshuli
} else {
// TODO: can the scaled down default photo be cached?
/* Vanzo:zhangshuli on: Thu, 12 Mar 2015 11:48:28 +0000
photo = mDefaultContactPhoto;
*/
// End of Vanzo: zhangshuli
}
Trace.traceEnd(Trace.TRACE_TAG_VIEW);
// Draw the photo on the left side.
if (photo != null) {
/// M: Only leave space if icon exists. @{
hasIcon = true;
width = ellipsizedTextWidth + (mChipPadding * 2) + iconWidth;
/// @}
RectF src = new RectF(0, 0, photo.getWidth(), photo.getHeight());
Rect backgroundPadding = new Rect();
mChipBackground.getPadding(backgroundPadding);
RectF dst = new RectF(width - iconWidth + backgroundPadding.left,
0 + backgroundPadding.top,
width - backgroundPadding.right,
height - backgroundPadding.bottom);
matrix = new Matrix();
matrix.setRectToRect(src, dst, Matrix.ScaleToFit.FILL);
}
} else if (!leaveBlankIconSpacer || isPhoneQuery()) {
iconWidth = 0;
} tmpBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
canvas = new Canvas(tmpBitmap); background.setBounds(0, 0, width, height);
background.draw(canvas);
if (photo != null && matrix != null) {
canvas.drawBitmap(photo, matrix, paint);
} /* Vanzo:shangxiaopeng on: Wed, 28 May 2014 11:03:56 +0800
* modify settings fun
paint.setColor(getContext().getResources().getColor(android.R.color.black));
*/
paint.setColor(getContext().getResources().getColor(android.R.color.white));
// End of Vanzo: shangxiaopeng
// Vertically center the text in the chip.
int xPositionOfText = hasIcon ? mChipPadding : (mChipPadding + (width - mChipPadding*2 - ellipsizedTextWidth)/2); /// M: Horizontally center the text in the chip
canvas.drawText(ellipsizedText, 0, ellipsizedText.length(), xPositionOfText,
getTextYOffset((String)ellipsizedText, paint, height), paint);
} else {
Log.w(TAG, "Unable to draw a background for the chips as it was never set");
} if (tmpBitmap == null) {
tmpBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
}
printDebugLog(TAG,"[createUnselectedChip] end");
return tmpBitmap;
}
但是,如果我们想要更改下拉框的布局,你会发现,无论你怎么在mediatek下修改都是没有效果的。后来发现要在它的父类中进行修改 AutoCompleteTextView
代码如下
public void showDropDown() {
buildImeCompletions();
if (mPopup.getAnchorView() == null) {
if (mDropDownAnchorId != View.NO_ID) {
mPopup.setAnchorView(getRootView().findViewById(mDropDownAnchorId));
} else {
mPopup.setAnchorView(this);
}
}
if (!isPopupShowing()) {
// Make sure the list does not obscure the IME when shown for the first time.
mPopup.setInputMethodMode(ListPopupWindow.INPUT_METHOD_NEEDED);
mPopup.setListItemExpandMax(EXPAND_MAX);
}
mPopup.show();
mPopup.getListView().setOverScrollMode(View.OVER_SCROLL_ALWAYS);
/* Vanzo:zhangshuli on: Wed, 11 Mar 2015 20:27:52 +0000
*/
mPopup.getListView().setPadding(0, 0, mPopupMargnRight, 0);
if (mPopupMargnRight != 0){
mPopup.getListView().setScrollBarStyle(ScrollView.SCROLLBARS_OUTSIDE_OVERLAY);
}
// End of Vanzo: zhangshuli
}
这个代码是修改下拉框滚动条样式跟listview中item的边距
这里面用到了关于添加自定义属性的方法,参照另一篇文章
RecipientsEditor-信息收件人输入框的更多相关文章
- TKinter之输入框
输入框是 Entry,应用程序要取得用户的信息,输入框是必不可少的. 输入框比较重要的一个函数: get:返回值即输入框的内容 比如e是一个输入框,e['show']='*'就变成了密码框 小例子:用 ...
- Autocomplete 自动补全(Webform实战篇)
开篇语 因为项目中需要用到一个自动补全的功能,功能描述: 需求一:新增收件人的时候,自动下拉显示出数据库中所有的收件人信息(显示的信息包括:姓名-收件地址-联系方式) 需求二:选中一个值得时候,分别赋 ...
- Selenium+Python之163邮件发送
今晚写了一个163邮箱登录的脚本,由于不停的访问163登录主页导致直接访问163邮箱主页登录需要输入验证码,因为无法获取到验证码,就这导致直接访问主页登录脚本不可行,为了绕过验证码,现在先访问hao1 ...
- 【框架】PageObject(一)
1.目的:为了将元素的find方法和业务逻辑分开来.如果元素的页面位置发生了变化,只需改动一个文件,而不影响业务的实现. 2.原理:一般一个页面对应一个class,在class里描述所有要用到的web ...
- python webdriver 登录163邮箱发邮件加附件, 外加数据和程序分离,配置文件的方式
配置文件:UiObjectMapSendMap.ini用来存放配置信息 GetOptionSendMail.py 用来读取配信息 #encoding=utf-8from selenium.webdri ...
- 二、jenkins配置email(以腾讯企业qq为例)
废话不多说,直接上干货: 主要针对两个部分进行介绍: 1.jenkins内置的邮件功能: 2.Editable Email Notification插件的邮件功能: 低版本的jenkins有很多插件都 ...
- [入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二)
[入门级] 基于 visual studio 2010 mvc4 的图书管理系统开发初步 (二) Date 周六 10 一月 2015 By 钟谢伟 Category website develop ...
- React Native实例之房产搜索APP
React Native 开发越来越火了,web app也是未来的潮流, 现在react native已经可以完成一些最基本的功能. 通过开发一些简单的应用, 可以更加熟练的掌握 RN 的知识. 在学 ...
- Yii表单验证
我之前在朋友的公司拿到他们oa的代码,发现是用Yii写的,oa系统比较简单,但是程序员对Yii的运用比较好,我拿来学习一下.如果有需要,我可以私下分享这个程序,因为是人家的功劳,不在网上公布代码了,只 ...
随机推荐
- gcc 生成动态链接库
http://blog.csdn.net/ngvjai/article/details/8520840 Linux下文件的类型是不依赖于其后缀名的,但一般来讲: .o,是目标文件,相当于windows ...
- Android设置背景图片平铺
以LinearLayout为例,它提供的background属性将会将背景图片拉伸,相当难看.其实我们仅仅需做少量的改动就能够实现web编程中css背景图片的效果.来试试吧. 创建反复的背景图片 在d ...
- 网络芯片应用:GPS公交车行驶记录仪
项目描写叙述 佛罗里达大学学生 Miles Moody 使用WIZnet W5200以太网插板及Arduino Nano剖析了来自一个当地网页服务的HTML代码,并讲述了他每天带着公交车实时GPS坐标 ...
- xml里面product的值在哪里设置的?
转载请注明出处:http://blog.csdn.net/droyon/article/details/39890469 在进行Android应用程序开发时,善于运用xml中的product配置,能够 ...
- elasticsearch搜索类型简单介绍
简单搜索 GET请求很easy--你能轻松获取你想要的文档.让我们来进一步尝试一些东西.比方简单的搜索! 我们尝试一个最简单的搜索所有员工的请求: GET /megacorp/employee/_se ...
- 基于express+redis高速实现实时在线用户数统计
作者:zhanhailiang 日期:2014-11-09 本文将介绍怎样基于express+redis高速实现实时在线用户数统计. 1. 在github.com上创建项目uv-tj.将其同步到本地: ...
- BZOJ2016: [Usaco2010 Feb]Chocolate Eating
[传送门:BZOJ2016] 简要题意: 贝西收到了N 块巧克力,她会在接下来的D 天里吃掉这些巧克力,她想制定一个计划,让她每 天的快乐度都保持在较高的水品上. 在第一天刚开始的时候,贝西的快乐度为 ...
- Controller接口控制器3
11.AbstractWizardFormController 向导控制器类提供了多步骤(向导)表单的支持(如完善个人资料时分步骤填写基本信息.工作信息.学校信息等) 假设现在做一个完善个人信息的功能 ...
- 基于CANopen DSP402的运动控制笔记
常用的mode of operation 有以下几种: 控制字 control word: 6--------------7---------------15--------------------7 ...
- android开源项目---View篇
本文转载自:http://blog.csdn.net/likebamboo/article/details/19080739 主要介绍那些不错个性化的View,包括ListView.ActionBar ...