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 を特別に ID したことを思い出してください。これにより、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 を「adapter」という変数に保存しました。

次のステップは、EditText から入力を取得することです。これには、実際には少し考えが必要です。EditText に OnKeyListener() を追加できます。ただし、このリスナーはいくつかの重要なイベントしか受信しません。たとえば、ユーザーが「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 に答える