【Android】利用AutoCompleteTextView控件联系人自动补全与根据联系人姓名查询电话

自动补全功能是app比较友好的功能之一,但利用AutoCompleteTextView自动补全文本框控件完成起来并不简单,因为其中涉及到AutoCompleteTextView填充数据的适配器,与AutoCompleteTextView的监听器。同时还需要利用ContentResolver去查找设备的通讯录,当然,这与《【Android】利用安卓的数据接口、多媒体处理编写内存卡Mp3播放器app》(点击打开链接)中遍历MP3与《【Android】Sqlite数据库增删改查》(点击打开链接)中遍历Sqlite数据库是一样的。下面举一个小例子,说明AutoCompleteTextView的使用:

如上图,假设在用户手机中有3个联系人,现在有一个能自动补全的文本框,输入完名字,自动显示其在通讯录的电话。如果没有则给出相应的信息。

制作过程如下:

1、首先res\values\strings.xml字体文件,没什么好说:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">自动补全联系人与寻找其电话</string>
    <string name="action_settings">Settings</string>
    <string name="textView1">姓名:</string>

</resources>

2、之后是res\layout\activity_main.xml中的布局修改。一个垂直的线性布局中间放一个水平的线性布局,使TextView1与自动完成的文本框处于一行。之后一个显示结果的TextView2赋予id,此处的autoCompleteTextView1设定android:completionThreshold="1",是指用户输入1个字符就开始给出补全信息了。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/textView1"
            android:textSize="24sp" />

        <AutoCompleteTextView
            android:id="@+id/autoCompleteTextView1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:completionThreshold="1" />
    </LinearLayout>

    <TextView
        android:id="@+id/textView2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="24sp" />

</LinearLayout>

3、在AndroidManifest.xml申请读取联系人的权限

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.autocomplete"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="18" />

    <uses-permission android:name="android.permission.READ_CONTACTS" /><!-- 要求读取通讯录 -->

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.autocomplete.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

4、MainActivity.java才是本app的重点,里面包含autoCompleteTextView自动文本框的适配器,用来填充数据的。数据是通过ContentResolver去查安卓设备中的联系人表查出来的姓名信息。之后,MainActivity本身实现TextWatcher接口,用来作为autoCompleteTextView自动文本框的监听器,当前用户选择自动补全的选项或者自己输入数据,都会给触发TextWatcher监听。根据联系人查询电话的时候,是需要同时对安卓中固有的两张表进行操作,一张是用户设备中的联系人姓名表,一张是与联系人姓名表同id排列的联系人电话表。具体代码具体如下:

package com.autocomplete;

import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.Contacts;
import android.support.v4.widget.CursorAdapter;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AutoCompleteTextView;
import android.widget.FilterQueryProvider;
import android.widget.Filterable;
import android.widget.TextView;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;

//autoCompleteTextView自动文本框的适配器
class ContactListAdapter extends CursorAdapter implements Filterable {

	private ContentResolver resolver;
	private String[] columns = new String[] { Contacts._ID,
			Contacts.DISPLAY_NAME };// 一会儿,游标查询出来的表就两列,一列是id,一列是联系人姓名

	public ContactListAdapter(Context context, Cursor c, int flags) {
		// 调用父类构造方法,此处ContactListAdapter(Context context, Cursor
		// c)方法已经过时,多出了一个参数flags
		// 其实都没有什么用,flags扔个0给它就OK
		super(context, c, flags);
		resolver = context.getContentResolver();// 初始化ContentResolver
	}

	// 这里要自己形成一个下拉菜单
	@Override
	public void bindView(View view, Context arg1, Cursor cursor) {
		((TextView) view).setText(cursor.getString(1));
	}

	@Override
	public View newView(Context context, Cursor cursor, ViewGroup parent) {
		LayoutInflater inflater = LayoutInflater.from(context);
		TextView view = (TextView) inflater.inflate(
				android.R.layout.simple_dropdown_item_1line, parent, false);
		view.setText(cursor.getString(1));// 各项项的文字,就是游标查询出来的,联系人姓名那一列
		return view;
	}

	@Override
	public CharSequence convertToString(Cursor cursor) {
		return cursor.getString(1);
	}

	@Override
	public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
		FilterQueryProvider filter = getFilterQueryProvider();
		if (filter != null) {
			return filter.runQuery(constraint);
		}
		// 这里是指明游标的查询的表,与查询结果列
		Uri uri = Uri.withAppendedPath(Contacts.CONTENT_FILTER_URI,
				Uri.encode(constraint.toString()));
		return resolver.query(uri, columns, null, null, null);
	}
}

public class MainActivity extends Activity implements TextWatcher {
	private AutoCompleteTextView autoCompleteTextView1;
	private TextView textView2;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		// 注册组件
		autoCompleteTextView1 = (AutoCompleteTextView) findViewById(R.id.autoCompleteTextView1);
		textView2 = (TextView) findViewById(R.id.textView2);
		// 构造autoCompleteTextView的适配器
		ContentResolver contentResolver = getContentResolver();
		String[] colmuns = new String[] { Contacts._ID, Contacts.DISPLAY_NAME };
		Cursor cursor = contentResolver.query(Contacts.CONTENT_URI, colmuns,
				null, null, null);
		ContactListAdapter contactListAdapter = new ContactListAdapter(this,
				cursor, 0);
		// 指明autoCompleteTextView的适配器与监听器
		autoCompleteTextView1.setAdapter(contactListAdapter);
		autoCompleteTextView1.addTextChangedListener(this);

	}

	// 根据联系人的姓名查询电话
	private String getQueryData(String name) {
		String phoneNum = "";
		// 查联系人姓名这张表,有无用户输入的姓名
		ContentResolver contentResolver1 = getContentResolver();
		String[] colmuns1 = new String[] { Contacts._ID, Contacts.DISPLAY_NAME };
		Cursor cursor1 = contentResolver1.query(Contacts.CONTENT_URI, null,
				null, null, null);
		for (cursor1.moveToFirst(); !(cursor1.isAfterLast()); cursor1
				.moveToNext()) {
			String contactsName = cursor1.getString(cursor1
					.getColumnIndex(colmuns1[1]));
			// 如果有,则开始查联系人电话这张表
			if (name.equals(contactsName)) {
				int id = cursor1.getInt(cursor1.getColumnIndex(colmuns1[0]));
				ContentResolver contentResolver2 = getContentResolver();
				String[] colmuns2 = new String[] { Phone.CONTACT_ID,
						Phone.NUMBER };
				// 查询的联系人电话这张表时候,加入一个条件,就查目录联系人姓名那列数据中的id
				// 由于联系人电话这张表与联系人姓名这张表是同id的
				// 查询参数放在第三个参数这个位置
				Cursor cursor2 = contentResolver2.query(Phone.CONTENT_URI,
						null, colmuns2[0] + "=" + id, null, null);
				if (cursor2.moveToNext()) {// 如果Cursor中有数据,要把初始位置为0的Cursor下拉一位才能拿到数据
					phoneNum = cursor2.getString(cursor2
							.getColumnIndex(colmuns2[1]));

				}
			}
		}
		return phoneNum;// 查到就返回相应的电话,没查到就扔回0
	}

	// autoCompleteTextView自动文本框的监听器,果断是等信息完完整整地摆到文本框才是查找
	@Override
	public void afterTextChanged(Editable arg0) {
		String name = autoCompleteTextView1.getText() + "";
		String phoneNum = getQueryData(name);
		if (phoneNum.equals("")) {
			textView2.setText("无此联系人!");
		} else {
			textView2.setText("电话为:" + phoneNum);
		}

	}

	@Override
	public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
			int arg3) {
		// TODO Auto-generated method stub

	}

	@Override
	public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
		// TODO Auto-generated method stub

	}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-19 18:35:46

【Android】利用AutoCompleteTextView控件联系人自动补全与根据联系人姓名查询电话的相关文章

[Android] AutoCompleteTextView:自动完成输入内容的控件(自动补全)

AutoCompleteTextView是EditText的直接子类,与普通EditText的最大不同就是,在用户输入的过程中,可以列出可供选择的输入项,方便使用者. AutoCompleteTextView与普通EditText控件使用方法类似,只是需要为其指定一个Adapter对象,绑定可供选择的输入项. AutoCompleteTextView可实现一次自动完成的功能,而另一个控件MultiAutoCompleteTextView,可以连续多次自动完成,即在通过自动完成一个输入项,接着输入

Android基础TOP5_2:MultiAutoCompleteTextView多文本自动补全文本框

Activity: 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5

Bolt XML和JQBolt Lua代码自动补全插件配置教程

Bolt没有提供官方IDE,缺少强大的代码提示和自动补全,Notepad++写起界面和脚本来比较费劲. Notepad++有个QuickText插件,支持多语言的自动补全,进行简单的配置就可以支持Bolt XML和JQBolt Lua代码. 配置后的效果,输入关键字,Ctrl+Enter自动补全: 下面介绍一下配置方法: 1.在JQBolt中下载QuickText插件和已经配置好的配置文件:https://github.com/zhenghecn/JQBolt,这两个文件在plugins目录下:

Redis(二) 自动补全

Redis自动补全: 1. 自动补全最近联系人 使用List列表结构有序地存储元素,redis主要用于记录联系人列表,而非实际的执行自动补全操作,数据的过滤及补全在客户端执行:对于较短的列表来说可行: 构建最近联系人自动补全列表,如果指定的联系人已经存在,将从列表移除该联系人,将他重新推入列表的最左端:对列表进行修剪,保留位于列表前的100个联系人: public void addUpdateContact(Jedis conn, String user, String contact) { S

Vim自动补全神器–YouCompleteMe

YouCompleteMe的特别之处 基于语义补全 总所周知,Vim是一款文本编辑器.也就是说,其最基础的工作就是编辑文本,而不管该文本的内容是什么.在Vim被程序员所使用后,其慢慢的被肩负了与IDE一样的工作,文本自动补全(ie.acp,omnicppcompleter),代码检查(Syntastic)等等工作. 针对文本自动补全这个功能来说,主要有两种实现方式. 基于文本 我们常用的omnicppcompleter,acp,vim自带的c-x, c-n的实现方式就是基于文本.更通俗的说法,其

Vim自动补全神器:YouCompleteMe(转)

转自:http://blog.jobbole.com/58978/ 可能会有一段时间写linxu,免不了用vim,留着,找时间实操之 原文出处: marchtea 的博客 第一次听说这个插件还是在偶然的情况下看到别人的博客,听说了这个插件的大名.本来打算在实训期间来完成安装的,无奈网实在不给力,也就拖到了回家的时候.在开始准备工作的时候就了解到这个插件不是很容易安装,安装的时候果然名不虚传.(关于这方面的内容,请查看另一篇文章)不过,有付出总有回报,安装之后用上这个插件,真心为这个插件的强大所折

Vim自动补全神器:YouCompleteMe

第一次听说这个插件还是在偶然的情况下看到别人的博客,听说了这个插件的大名.本来打算在实训期间来完成安装的,无奈网实在不给力,也就拖到了回家的时候.在开始准备工作的时候就了解到这个插件不是很容易安装,安装的时候果然名不虚传.(关于这方面的内容,请查看另一篇文章)不过,有付出总有回报,安装之后用上这个插件,真心为这个插件的强大所折服. 那这个插件有何不同? YouCompleteMe的特别之处 基于语义补全 总所周知,Vim是一款文本编辑器.也就是说,其最基础的工作就是编辑文本,而不管该文本的内容是

Vim自动补全神器&ndash;YouCompleteMe

一.简介 YouCompleteMe是Vim的自动补全插件,与同类插件相比,具有如下优势1.基于语义补全2.整合实现了多种插件 clang_complete.AutoComplPop .Supertab .neocomplcache .Syntastic(类似功能,仅仅针对c/c++/obj-c代码) 3.支持多种语言 c.c++.obj-c.c#.python 对于其他的语言,会调用vim设置的omnifunc来匹配,因此同样支持php,ruby等语言. 4.YouCompleteMe除了提供

Android Studio开发基础之AutoCompleteTextView控件的使用

在输入框中输入我们想要输入的信息就会出现其他与其相关的提示信息,这种效果在Android中是用AutoCompleteTextView实现的.AutoCompleteTextView控件继承自TextView控件,也有其特有的属性: AutoCompleteTextView常用属性 android:completionHint 设置出现在下拉菜单中的提示标题 android:completionThreshold 设置用户至少输入多少个字符才会显示提示 android:dropDownHoriz