我试图在android中选择联系人API。
此处代码
public void onActivityResult(int reqCode, int resultCode, Intent data) {
super.onActivityResult(reqCode, resultCode, data);
switch (reqCode) {
case (PICK_CONTACT) :
if (resultCode == Activity.RESULT_OK) {
Uri contactData = data.getData();
Cursor c = managedQuery(contactData, null, null, null, null);
if (c.moveToFirst()) {
String id =c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts._ID));
String hasPhone =c.getString(c.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
if (hasPhone.equalsIgnoreCase("1")) {
Cursor phones = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = "+ id,
null, null);
phones.moveToFirst();
cNumber = phones.getString(phones.getColumnIndex("data1"));
System.out.println("number is:"+cNumber);
}
/*name = c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
Textcontact.setText(name);*/
edt.setText(cNumber);
}
}
break;
}
}
注意: 我需要像android联系人搜索一样的功能
答案 0 :(得分:2)
首先,您需要创建一个包含EditText和ListView的XML布局。
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<!-- Pretty hint text, and maxLines -->
<EditText android:id="@+building_list/search_box"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="type to filter"
android:inputType="text"
android:maxLines="1"/>
<!-- Set height to 0, and let the weight param expand it -->
<!-- Note the use of the default ID! This lets us use a
ListActivity still! -->
<ListView android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
/>
</LinearLayout>
这将使一切正常,在ListView上方有一个很好的EditText。接下来,像往常一样创建ListActivity,但在onCreate()方法中添加setContentView()调用,以便我们使用最近声明的布局。请记住,我们特别使用android:id =“@ android:id / list”来识别ListView。这允许ListActivity知道我们想要在声明的布局中使用哪个ListView。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.filterable_listview);
setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
getStringArrayList());
}
现在运行应用程序应该显示以前的ListView,上面有一个很好的框。为了使该框执行某些操作,我们需要从中获取输入,并使该输入过滤列表。虽然很多人都尝试手动执行此操作,但大多数ListView Adapter类都带有一个Filter对象,可用于自动执行过滤。我们只需要将EditText的输入传递给Filter。事实证明这很容易。要运行快速测试,请将此行添加到onCreate()调用
adapter.getFilter().filter(s);
请注意,您需要将ListAdapter保存到变量才能使其正常工作 - 我已将之前的ArrayAdapter保存到名为“adapter”的变量中。
下一步是从EditText获取输入。这实际上需要一些思考。您可以在EditText中添加OnKeyListener()。但是,此侦听器仅接收一些关键事件。例如,如果用户输入“wyw”,预测文本可能会推荐“眼睛”。在用户选择“wyw”或“eye”之前,OnKeyListener将不会收到关键事件。有些人可能更喜欢这种解决方案,但我发现它令人沮丧。我想要每个关键事件,所以我可以选择过滤或不过滤。解决方案是TextWatcher。只需创建TextWatcher并将其添加到EditText,并在每次文本更改时传递ListAdapter过滤器过滤请求。记得在OnDestroy()中删除TextWatcher!这是最终的解决方案:
private EditText filterText = null;
ArrayAdapter<String> adapter = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.filterable_listview);
filterText = (EditText) findViewById(R.id.search_box);
filterText.addTextChangedListener(filterTextWatcher);
setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
getStringArrayList());
}
private TextWatcher filterTextWatcher = new TextWatcher() {
public void afterTextChanged(Editable s) {
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void onTextChanged(CharSequence s, int start, int before,
int count) {
adapter.getFilter().filter(s);
}
};
@Override
protected void onDestroy() {
super.onDestroy();
filterText.removeTextChangedListener(filterTextWatcher);
}