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的运用比较好,我拿来学习一下.如果有需要,我可以私下分享这个程序,因为是人家的功劳,不在网上公布代码了,只 ...
随机推荐
- IPMI远程管理一点记录
http://www.07net01.com/storage_networking/IPMIyuanchengguanliyidianjilu_53093_1357975254.html
- WIN10远程桌面连接--“出现身份验证错误。要求的函数不支持”
最近WIN10升级补丁后发现远程桌面无法连接了,报“出现身份验证错误.要求的函数不支持”的错误: 解决办法: 第一种,配置本地自己的电脑,开始菜单->搜索gpedit.msc并打开 打开配置 ...
- ios 绘图,绘制坐标系,画坐标系
先来看个效果: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/d ...
- [React] Implement a React Context Provider
If you have state that needs to exist throughout your application, then you may find yourself passin ...
- cocos2d-js导弹跟踪算法(一边追着目标移动一边旋转角度)
跟踪导弹 function(targetPosition){ // 让物体朝目标移动的方法 ; var targetPoint = targetPosition; var thisPoint = cc ...
- Unity 之 C# 利用回调函数实现C++匿名函数
做C++开发的都用过匿名函数很好用,可是C#开发怎么实现呢?前几天做一个拍照功能的时候.我偶然发现某个函数假设是C++的话.用匿名函数太好了,于是開始研究C#的回调,代理.托付等,最后总算是实现了我想 ...
- SharePoint Search之(五)Query spelling correction— 查询拼写纠正
Query spelling correction 在使用搜索引擎的时候.假设一不小心输入错误,或者对于某个词语记得不太清楚,搜索引擎会自己主动纠正: 这个功能可以缩短用户的时间,很好用.在Sh ...
- ivms4200 远程桌面访问测试过程及问题汇总
17.11.4 测试存储服务器配置后能否自动录像确认 10:34 4200客户端关闭 10:40 打开4200客户端软件 10:51 关机 10:56 开机,有提示出现,“防火墙阻止... ...
- UVC和V4L2的关系(转载)
UVC是一种usb视频设备驱动.用来支持usb视频设备,凡是usb接口的摄像头都能够支持 V4L2是Linux下的视频采集框架.用来统一接口,向应用层提供API UVC: USB video clas ...
- chmod---变更文件或目录的权限
chmod命令用来变更文件或目录的权限.在UNIX系统家族里,文件或目录权限的控制分别以读取.写入.执行3种一般权限来区分,另有3种特殊权限可供运用.用户可以使用chmod指令去变更文件与目录的权限, ...