一步一步学android控件(之二十六)—— QuickContacBadge

原创 2013年12月03日 11:27:32

QuickContacBadge译为联系人快捷标识,用于显示一张图片,点击该图后弹出相关的快捷功能,如打电话、发短信等。

QuickContacBadge提供了三个方法指定联系人的信息:

1、assignContactUri(Uri contactUri) : 联系人Uri

2、assignContactFromPhone(String phonNumber,boolean lazyLookup) : 从电话号码加载联系人信息。phonNumber: 电话号码 ;lazyLookup:是否延迟加载。注:这个方法应该只在不知道联系人uri的情况下使用(该方法会多做一次查询)。

3、assignContactFromEmail(String emailAddress, boolean lazyLookup):从邮箱号码加载联系人信息。 emailAddress:邮箱地址; lazyLookup:是否延迟加载。

assignContactFromPhone(String phonNumber,boolean lazyLookup) 的源码如下:

public void assignContactFromPhone(String phoneNumber, boolean lazyLookup) {
        mContactPhone = phoneNumber;
        if (!lazyLookup) {
            mQueryHandler.startQuery(TOKEN_PHONE_LOOKUP, null,
                    Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, mContactPhone),
                    PHONE_LOOKUP_PROJECTION, null, null, null);
        } else {
            mContactUri = null;
            onContactUriChanged();
        }
    }
可以看到如果是lazyLookup为false,则立即加载信息。

通过源码:

@Override
    public void onClick(View v) {
        if (mContactUri != null) {
            QuickContact.showQuickContact(getContext(), QuickContactBadge.this, mContactUri,
                    QuickContact.MODE_LARGE, mExcludeMimes);
        } else if (mContactEmail != null) {
            mQueryHandler.startQuery(TOKEN_EMAIL_LOOKUP_AND_TRIGGER, mContactEmail,
                    Uri.withAppendedPath(Email.CONTENT_LOOKUP_URI, Uri.encode(mContactEmail)),
                    EMAIL_LOOKUP_PROJECTION, null, null, null);
        } else if (mContactPhone != null) {
            mQueryHandler.startQuery(TOKEN_PHONE_LOOKUP_AND_TRIGGER, mContactPhone,
                    Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, mContactPhone),
                    PHONE_LOOKUP_PROJECTION, null, null, null);
        } else {
            // If a contact hasn't been assigned, don't react to click.
            return;
        }
    }
可以看到,当用户点击后是通过一个handler去加载数据的,QueryHandler的代码如下:

 private class QueryHandler extends AsyncQueryHandler {

        public QueryHandler(ContentResolver cr) {
            super(cr);
        }

        @Override
        protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
            Uri lookupUri = null;
            Uri createUri = null;
            boolean trigger = false;

            try {
                switch(token) {
                    case TOKEN_PHONE_LOOKUP_AND_TRIGGER:
                        trigger = true;
                        createUri = Uri.fromParts("tel", (String)cookie, null);

                        //$FALL-THROUGH$
                    case TOKEN_PHONE_LOOKUP: {
                        if (cursor != null && cursor.moveToFirst()) {
                            long contactId = cursor.getLong(PHONE_ID_COLUMN_INDEX);
                            String lookupKey = cursor.getString(PHONE_LOOKUP_STRING_COLUMN_INDEX);
                            lookupUri = Contacts.getLookupUri(contactId, lookupKey);
                        }

                        break;
                    }
                    case TOKEN_EMAIL_LOOKUP_AND_TRIGGER:
                        trigger = true;
                        createUri = Uri.fromParts("mailto", (String)cookie, null);

                        //$FALL-THROUGH$
                    case TOKEN_EMAIL_LOOKUP: {
                        if (cursor != null && cursor.moveToFirst()) {
                            long contactId = cursor.getLong(EMAIL_ID_COLUMN_INDEX);
                            String lookupKey = cursor.getString(EMAIL_LOOKUP_STRING_COLUMN_INDEX);
                            lookupUri = Contacts.getLookupUri(contactId, lookupKey);
                        }
                        break;
                    }
                }
            } finally {
                if (cursor != null) {
                    cursor.close();
                }
            }

            mContactUri = lookupUri;
            onContactUriChanged();

            if (trigger && lookupUri != null) {
                // Found contact, so trigger QuickContact
                QuickContact.showQuickContact(getContext(), QuickContactBadge.this, lookupUri,
                        QuickContact.MODE_LARGE, mExcludeMimes);
            } else if (createUri != null) {
                // Prompt user to add this person to contacts
                final Intent intent = new Intent(Intents.SHOW_OR_CREATE_CONTACT, createUri);
                getContext().startActivity(intent);
            }
        }
    }

下面是个简单的使用QuickContacBadge的示例,首先看看效果:


1、widget_quick_contact_alyout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <QuickContactBadge
        android:id="@+id/show_quick_contact"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:layout_marginTop="30dp"
        android:src="@drawable/quick_contact" />

</LinearLayout>

2、activity——WidgetQuickContactActivity.java
package com.xy.zt.selfdefinewieget;

import android.app.Activity;
import android.os.Bundle;
import android.widget.QuickContactBadge;

public class WidgetQuickContactActivity extends Activity {

    private QuickContactBadge mQcb;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.widget_quick_contact_alyout);
        init();
    }

    private void init() {
        mQcb = (QuickContactBadge) findViewById(R.id.show_quick_contact);
        mQcb.assignContactFromPhone("02885322828", true);
    }
}

3、在ViewData.java中添加如下代码(此部分内容可选),若有不清楚的地方参见 一步一步学android控件(之一) —— 开始篇
public static final int QUICK_CONTACT_BADGE_ID = SEEK_BAR_ID + 1;
    public static final String QUICK_CONTACT_BADGE_NAME = "QuickContactBadge";
private static final ViewData mQuickContact = new ViewData(QUICK_CONTACT_BADGE_NAME,
            QUICK_CONTACT_BADGE_ID);
View_Datas.add(mQuickContact);
WidgetAdapter的handleItemClicked方法中添加如下代码:

case ViewData.QUICK_CONTACT_BADGE_ID:
                intent.setClass(mContext, WidgetQuickContactActivity.class);
                mContext.startActivity(intent);
                break;


以上就是QuickContacBadge的全部内容,下一个控件 SlidingDrawer 。


一步一步学zedboard之六生成镜像文件

用xilinx提供的petalinux tools,petalinux-build可以生成我们所需要的各种镜像文件。...
  • zhoudengqing
  • zhoudengqing
  • 2014年11月17日 15:06
  • 767

一步一步学ROP之Android ARM 32位篇

0x00    本文仅解释说明蒸米大神一步一步学ROP之Android ARM 32位篇,读者应先阅读这篇文章,遇到问题再来看我这篇文章。   0x01    第一个问题:payload = 'A'*...
  • jltxgcy
  • jltxgcy
  • 2016年02月19日 17:48
  • 1955

一步一步学ROP之linux_x86篇

0x00    本文仅解释说明蒸米大神一步一步学ROP之linux_x86篇,读者应先阅读这篇文章,遇到问题再来看我这篇文章。    阅读完这两篇文章后,我们会理解ROP(返回导向编程),DEP(堆栈...
  • jltxgcy
  • jltxgcy
  • 2016年02月19日 11:16
  • 2446

一步一步学android控件(之二) —— TextView

android 控件众多 , 额 , 具体多少个呢? 貌似有那么几十个吧,也没做个统计,嘿嘿!...... 有木有朋友感觉写了那么长时间的android代码,有时候想写点自己的东西的时候却发现自己好...
  • sun_star1chen
  • sun_star1chen
  • 2013年10月26日 00:27
  • 3450

一步一步学springboot 一

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通...
  • u010509052
  • u010509052
  • 2017年04月23日 23:12
  • 446

一步一步学做一个CPU——1,准备工作

一,准备工作 参考: 罗老板的计算机结构与组成课程 http://xgxy.cug.edu.cn/rjgcx/lzw/COD/ Machine Structures. Spri...
  • wyq120547
  • wyq120547
  • 2014年06月17日 12:05
  • 1338

小菜一步一步学数据结构之(二)算法和算法分析

一次数学课上,老师让学生练习算数。于是让他们一个小时内算出1+2+3+4+5+6+……+100的得数。全班只有高斯用了不到20分钟给出了答案,因为他想到了用(1+100)+(2+99)+(3+98)…...
  • IT_DS
  • IT_DS
  • 2016年01月12日 13:15
  • 1004

【一步一步学NPOI】

【一步一步学NPOI】1.创建Excel 【一步一步学NPOI】2.设置单元格格式 【一步一步学NPOI】3.设置单元格宽高和边框 【一步一步学NPOI】4.字体与背景 【一步一步学NPOI】5...
  • aa2012123456
  • aa2012123456
  • 2016年02月15日 09:00
  • 408

一步一步学RMAN第一篇 进入RMAN

 哈哈~~~~~天苍苍野茫茫,三思终于又出场。要问三思来干啥,来把RMAN讲一讲。吃喝玩乐间学习,心得体会一箩筐。不管结论对与错,先把过程来分享。如有异议务必提,共同学习共提高。  en,写的还挺顺口...
  • junsisi
  • junsisi
  • 2007年09月17日 16:58
  • 3538

一步一步跟我学hadoop(1)----hadoop概述和安装配置

这几年云计算大数据很火,借这个东风,今天开始学习apache的分布式计算框架hadoop,希望不要太落后。 Apache Hadoop是一个在大型集群的商品硬件上运行的应用程序的框架。Hadoop框架...
  • wuyinggui10000
  • wuyinggui10000
  • 2015年07月05日 23:08
  • 2325
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一步一步学android控件(之二十六)—— QuickContacBadge
举报原因:
原因补充:

(最多只允许输入30个字)