一步一步学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 。


Android QuickContactBadge

QuickContactBadge,联系人快捷标识,具体效果为显示一张联系人图片,点一下弹出与之相关的快捷功能栏,如打电话、发短信等。 activity_main.xml: ...

QuickContactBadge的用法

首先上个运行效果图:   下边是ListView 中单个Item的布局文件:     xmlns:android="http://schemas.android.com/apk/res/and...

android中提供了QuickContactBadge

android中提供了QuickContactBadge来实现这一效果。这里简单演示下。 首先创建布局文件:               android:ori...

安卓用QuickContactBadge和AsyncQueryHandler实现联系人列表的完美实现

写个博客真的要花费很多的时间,但是还是学到了很多的东西,这是一个联系人列表的demo...

QuickContactBadge(联系人快捷标识控件)的使用

android.widget.QuickContactBadge:译为联系人快捷标识,具体效果为显示一张联系人图片,点一下弹出与之相关的快捷功能栏,如打电话、发短信等   公共方法: //指定联...

关于在Android Studio中使用Assets目录下的资源的问题

转载原文地址:关于在Android Studio中使用Assets目录下的资源的问题一开始在Android Studio中读取Assets目录下的资源的时候,用的是Eclipse下的getResour...
  • wsgqp
  • wsgqp
  • 2016年07月12日 23:23
  • 2723

python实战--csdn博客专栏下载器

打算利用业余时间好好研究Python的web框架--web.py,深入剖析其实现原理,体会web.py精巧之美。但在研究源码的基础上至少得会用web.py。思前想后,没有好的Idea,于是打算开发一个...

android控件 —— QuickContacBadge

QuickContacBadge译为联系人快捷标识,用于显示一张图片,点击该图后弹出相关的快捷功能,如打电话、发短信等。  QuickContacBadge提供了三个方法指定联系人的信息:  1、...

一步一步学android之基本控件——CheckBox组件

昨天讲了单选按钮,今天说下复选框CheckBox,它的主要功能是完成复选框的操作,当用户输入信息时,可以一次性选择多个内容,例如你喜欢吃什么水果,结果可能是多种,这个时候就可以用复选框来实现逻辑。此类...

一步一步学android控件(之五) —— AutoCompleteTextView

android 控件众多 , 额 , 具体多少个呢? 貌似有那么几十个吧,也没做个统计,嘿嘿!...... 有木有朋友感觉写了那么长时间的android代码,有时候想写点自己的东西的时候却发现自己好像...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一步一步学android控件(之二十六)—— QuickContacBadge
举报原因:
原因补充:

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