0

我试图在 android 中选择联系人 API。

  • 当我使用以下方法(CONTENT_URI)时,它工作正常。
  • 但我无法在联系人 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 联系人搜索这样的功能

4

1 回答 1

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 适配器类都带有一个 Filter 对象,可用于自动执行过滤。我们只需要将 EditText 中的输入通过管道传输到 Filter 中。事实证明这很容易。要运行快速测试,请将此行添加到您的 onCreate() 调用

adapter.getFilter().filter(s);

请注意,您需要将您的 ListAdapter 保存到一个变量中才能使这项工作 - 我已将之前的 ArrayAdapter 保存到一个名为“适配器”的变量中。

下一步是从 EditText 获取输入。这实际上需要一些思考。您可以将 OnKeyListener() 添加到您的 EditText。但是,此侦听器仅接收一些关键事件。例如,如果用户输入“wyw”,则预测文本可能会推荐“eye”。在用户选择“wyw”或“eye”之前,您的 OnKeyListener 不会收到按键事件。有些人可能更喜欢这个解决方案,但我发现它令人沮丧。我想要每个关键事件,所以我可以选择过滤或不过滤。解决方案是 TextWatcher。只需创建一个 TextWatcher 并将其添加到 EditText,并在每次文本更改时向 ListAdapter Filter 传递一个过滤器请求。记得删除 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);
}
于 2013-03-05T09:14:31.247 回答