2012-12-10 60 views
0

我有contactmanager.java顯示從手機讀取並顯示聯繫人。當我點擊某個聯繫人列表時,它不會顯示確切的聯繫人詳細信息。我可以知道爲什麼嗎?Android:單擊目標對象的顯示詳細信息

/* 
* Copyright (C) 2009 The Android Open Source Project 
* 
* Licensed under the Apache License, Version 2.0 (the "License"); 
* you may not use this file except in compliance with the License. 
* You may obtain a copy of the License at 
* 
*  http://www.apache.org/licenses/LICENSE-2.0 
* 
* Unless required by applicable law or agreed to in writing, software 
* distributed under the License is distributed on an "AS IS" BASIS, 
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
* See the License for the specific language governing permissions and 
* limitations under the License. 
*/ 

package com.example.android.contactmanager; 

import android.app.Activity; 
import android.content.Intent; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.provider.ContactsContract; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.Button; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.CompoundButton.OnCheckedChangeListener; 
import android.widget.ListView; 
import android.widget.SimpleCursorAdapter; 

public final class ContactManager extends Activity implements OnItemClickListener 
{ 

    public static final String TAG = "ContactManager"; 

    private Button mAddAccountButton; 
    private ListView mContactList; 
    private boolean mShowInvisible; 
    //public BooleanObservable ShowInvisible = new BooleanObservable(false); 
    private CheckBox mShowInvisibleControl; 

    /** 
    * Called when the activity is first created. Responsible for initializing the UI. 
    */ 



    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 


     Log.v(TAG, "Activity State: onCreate()"); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.contact_manager); 

     // Obtain handles to UI objects 
     mAddAccountButton = (Button) findViewById(R.id.addContactButton); 
     mContactList = (ListView) findViewById(R.id.contactList); 
     mShowInvisibleControl = (CheckBox) findViewById(R.id.showInvisible); 

     // Initialise class properties 
     mShowInvisible = false; 
     mShowInvisibleControl.setChecked(mShowInvisible); 

     // Register handler for UI elements 
     mAddAccountButton.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       Log.d(TAG, "mAddAccountButton clicked"); 
       launchContactAdder(); 
      } 
     }); 
     mShowInvisibleControl.setOnCheckedChangeListener(new OnCheckedChangeListener() 
     { 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
      { 
       Log.d(TAG, "mShowInvisibleControl changed: " + isChecked); 
       mShowInvisible = isChecked; 
       populateContactList(); 
      } 
     }); 

     mContactList = (ListView) findViewById(R.id.contactList); 
     mContactList.setOnItemClickListener(this); 

     // Populate the contact list 
     populateContactList(); 
    } 



    /** 
    * Populate the contact list based on account currently selected in the account spinner. 
    */ 
    private void populateContactList() { 
     // Build adapter with contact entries 
     Cursor cursor = getContacts(); 
     String[] fields = new String[] { 
       ContactsContract.Data.DISPLAY_NAME, 
     }; 


     SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.contact_entry, cursor, 
       fields, new int[] {R.id.contactEntryText}); 
     mContactList.setAdapter(adapter); 
    } 

    /** 
    * Obtains the contact list for the currently selected account. 
    * 
    * @return A cursor for for accessing the contact list. 
    */ 
    private Cursor getContacts() 
    { 
     // Run query 
     Uri uri = ContactsContract.Contacts.CONTENT_URI; 
     Log.i("Uri ContactsContract.Contacts.CONTENT_URI" + ContactsContract.Contacts.CONTENT_URI, null, null); 

     String[] projection = new String[] 
       { 
       ContactsContract.Contacts._ID, 
       ContactsContract.Contacts.DISPLAY_NAME, 
       //ContactsContract.Contacts.DISPLAY_PHONE 
       }; 
     String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" + (mShowInvisible ? "0" : "1") + "'"; 
     //String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" + (mShowInvisible.get() ? "0" : "1") + "'"; 
     String[] selectionArgs = null; 
     String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; 

     return this.managedQuery(uri, projection, selection, selectionArgs, sortOrder); 
    } 

    /** 
    * Launches the ContactAdder activity to add a new contact to the selected account. 
    */ 
    protected void launchContactAdder() 
    { 
     Intent i = new Intent(this, ContactAdder.class); 
     startActivity(i); 
    } 

    public void onItemClick(AdapterView<?> l, View v, int position, long id) { 
     Log.i("TAG", "You clicked item " + id + " at position " + position); 
     // Here you start the intent to show the contact details 
    // selected item 
     //String contactDetails = (String)(mContactList.getItemAtPosition(position)); 
     //Uri contactDetails = ContactsContract.Contacts.CONTENT_URI; 

     Cursor cursor = getContacts(); 
     //Cursor emailCur = getContacts(); 
     cursor.moveToPosition(position); 
     String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 
     int phone = cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA)); 
     //String email = emailCur.getColumnName(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 


     // Launching new Activity on selecting single List Item 
     Intent i = new Intent(getApplicationContext(), SingleListContact.class); 
     SingleListContact.PutDetails(ContactsContract.Contacts._ID, name, phone,null); 

     Log.i("Show Contact Clicked: ", name); 
     // sending data to new activity 
     //i.putExtra("Contact Person", contactDetails); 
     startActivity(i); 

    } 


} 

而且SingleListContent.java

package com.example.android.contactmanager; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.provider.ContactsContract; 
import android.util.Log; 
import android.widget.EditText; 
import android.widget.TextView; 

public class SingleListContact extends Activity{ 

    static int ContactPhone; 
    static String ContactID, ContactName, ContactEmail; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.setContentView(R.layout.single_list_contact_view); 

     EditText txtContact = (EditText) findViewById(R.id.editText1); 
     txtContact.setText(ContactName); 

//  EditText txtContact2 = (EditText) findViewById(R.id.editText2); 
//  txtContact2.setText(ContactPhone); 

     EditText txtContact3 = (EditText) findViewById(R.id.editText3); 
     txtContact3.setText(ContactEmail); 


// 
//  Intent i = getIntent(); 
//  // getting attached intent data 
//  String contact = i.getStringExtra("contact"); 
//  // displaying selected product name 
//  txtContact.setText(contact); 
     Log.e("test", ContactID +" & " + ContactName); 


    } 

    static void PutDetails (String id, String name, int phone, String email) 
    { 
     ContactID = id; 
     ContactName = name; 
     ContactPhone = phone; 
     ContactEmail = email; 


    } 
} 

回答

1

你已經做到了完全錯誤的,這就是爲什麼它不工作。

在第一個代碼片斷中,您在PutDetails方法中傳遞了錯誤的值。

對於您傳遞的名稱ContactsContract.Data.DISPLAY_NAME,它不是名稱,它是表示電話簿的contactName列的字符串。所以要獲得名稱使用以下內容。

cursor.moveToPosition(position); 
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); 

對於發送空值的電子郵件,電子郵件將顯示爲空。如果你想同樣使用聯繫人的電子郵件

String email = emailCur.getString(
       emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 
String emailType = emailCur.getString(
       emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)); 

在這裏,我可以看到你只使用名稱和電子郵件。但是,如果你想要電話號碼,那麼你必須找到它,因爲在這裏你沒有發送任何電話號碼,但只有位置。

+0

其中我應該兩個cursor.position ....和字符串名稱?在contactmanager.java中? –

+0

SharedPreference和PutDetails有什麼不同? –

+1

抱歉,我在提出最後一條評論時犯了一個錯誤。我其實想寫Putextra而不是sharedpreference。在這裏,您可以使用Intent.Putextra將值傳遞給下一個活動,而不是使用靜態設置器方法。這是一個很好的做法。您可以通過調用getextra來獲取第二個活動的數據。對於這些方法,請參閱android api文檔。 – stinepike