I'm creating a PreferencesActivity where I have 3 preference items. When I click on each of them, I load contacts to pick one. After selecting a contact, I save it's name and phone number and I show it in the preference item. This is the way I do it:
preferences.xml
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android" >
<PreferenceCategory
android:title="@string/contact">
<Preference
android:key="Contact1"
android:title="Contact 1"/>
<Preference
android:key="Contact2"
android:title="Contact 2"/>
<Preference
android:key="Contact3"
android:title="Contact 3"/>
</PreferenceCategory>
</PreferenceScreen>
UserSettingsActivity.java extending PreferenceActivity
SharedPreferences mPreferences;
Preference contact1;
Preference contact2;
Preference contact3;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.preferences);
contact1 = findPreference("Contact1");
contact2 = findPreference("Contact2");
contact3 = findPreference("Contact3");
contact1.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent, PICK_CONTACT_1);
return false;
}
});
contact2.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent, PICK_CONTACT_2);
return false;
}
});
contact3.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
public boolean onPreferenceClick(Preference preference) {
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent, PICK_CONTACT_3);
return false;
}
});
}
@Override
public void onActivityResult(int reqCode, int resultCode, Intent data) {
super.onActivityResult(reqCode, resultCode, data);
Uri contactData = data.getData();
switch(reqCode) {
case (PICK_CONTACT_1):
if (resultCode == RESULT_OK){
String contactID = null;
String contactNumber = null;
String contactName = null;
/*Get contact ID*/
Cursor cursorID = getContentResolver().query(contactData, new String[]{ContactsContract.Contacts._ID},
null, null, null);
if (cursorID.moveToFirst()) {
contactID = cursorID.getString(cursorID.getColumnIndex(ContactsContract.Contacts._ID));
}
cursorID.close();
/*Get contact number using ID*/
Cursor cursorPhone = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER},
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ? AND " +
ContactsContract.CommonDataKinds.Phone.TYPE + " = " +
ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE,
new String[]{contactID}, null);
if (cursorPhone.moveToFirst()) {
contactNumber = cursorPhone.getString(cursorPhone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
}
cursorPhone.close();
/*Get name*/
Cursor cursor = getContentResolver().query(contactData, null, null, null, null);
if (cursor.moveToFirst()) {
contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
}
cursor.close();
/*Show on preferences*/
contact1.setTitle(contactName);
contact1.setSummary(contactNumber);
}
case (PICK_CONTACT_2):
if (resultCode == RESULT_OK){
String contactID = null;
String contactNumber = null;
String contactName = null;
/*Get contact ID*/
Cursor cursorID = getContentResolver().query(contactData, new String[]{ContactsContract.Contacts._ID},
null, null, null);
if (cursorID.moveToFirst()) {
contactID = cursorID.getString(cursorID.getColumnIndex(ContactsContract.Contacts._ID));
}
cursorID.close();
/*Get contact number using ID*/
Cursor cursorPhone = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER},
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ? AND " +
ContactsContract.CommonDataKinds.Phone.TYPE + " = " +
ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE,
new String[]{contactID}, null);
if (cursorPhone.moveToFirst()) {
contactNumber = cursorPhone.getString(cursorPhone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
}
cursorPhone.close();
/*Get name*/
Cursor cursor = getContentResolver().query(contactData, null, null, null, null);
if (cursor.moveToFirst()) {
contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
}
cursor.close();
/*Show on preferences*/
contact2.setTitle(contactName);
contact2.setSummary(contactNumber);
}
case (PICK_CONTACT_3):
if (resultCode == RESULT_OK){
String contactID = null;
String contactNumber = null;
String contactName = null;
/*Get contact ID*/
Cursor cursorID = getContentResolver().query(contactData, new String[]{ContactsContract.Contacts._ID},
null, null, null);
if (cursorID.moveToFirst()) {
contactID = cursorID.getString(cursorID.getColumnIndex(ContactsContract.Contacts._ID));
}
cursorID.close();
/*Get contact number using ID*/
Cursor cursorPhone = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
new String[]{ContactsContract.CommonDataKinds.Phone.NUMBER},
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ? AND " +
ContactsContract.CommonDataKinds.Phone.TYPE + " = " +
ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE,
new String[]{contactID}, null);
if (cursorPhone.moveToFirst()) {
contactNumber = cursorPhone.getString(cursorPhone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
}
cursorPhone.close();
/*Get name*/
Cursor cursor = getContentResolver().query(contactData, null, null, null, null);
if (cursor.moveToFirst()) {
contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
}
cursor.close();
/*Show on preferences*/
contact3.setTitle(contactName);
contact3.setSummary(contactNumber);
}
}
}
The problem is that when I set a contact for Contact1
, also Contact2
and Contact3
are getting the same contact. Is the first time I'm working with preferences so I don't know what could be the reason for this.
The problem isn't with the Preferences but rather, with the switch
statement.
You need to break
at the end of each statement. Without a break
, statements after a matching case label will be executed sequentially, regardless of the expressions of subsequent case labels.
Just include a break statement to prevent the statements in your switch blocks from falling through:
switch(reqCode) {
case (PICK_CONTACT_1):
---------
---------
break;
case (PICK_CONTACT_2):
---------
---------
break;
case (PICK_CONTACT_3):
---------
---------
break;
}