Android 如何制作在EditText旁边显示按钮的DialogPreference?
有一个问题让我抓狂 我需要有两个稍微不同的(可以是参数化的)和非常具体的偏好类型 一个是编辑文本,旁边有一个按钮。 EditText可用于输入(修改)电话号码,而该按钮可打开“联系人”对话框并可用于选择联系人号码 另一个偏好非常相似,如果不完全相同,但允许您从另一个联系人中选择电子邮件(并不是说电话和电子邮件来自同一个联系人,它们可以(通常应该)来自不同的人) 这些自定义首选项应该在PreferenceActivities以及PreferenceFragments中工作 更好的是,如果编辑文本的左边也可以有联系人的照片-但这只是做梦,我知道 你知道我怎样才能做到那样吗?Android 如何制作在EditText旁边显示按钮的DialogPreference?,android,button,android-edittext,preference,Android,Button,Android Edittext,Preference,有一个问题让我抓狂 我需要有两个稍微不同的(可以是参数化的)和非常具体的偏好类型 一个是编辑文本,旁边有一个按钮。 EditText可用于输入(修改)电话号码,而该按钮可打开“联系人”对话框并可用于选择联系人号码 另一个偏好非常相似,如果不完全相同,但允许您从另一个联系人中选择电子邮件(并不是说电话和电子邮件来自同一个联系人,它们可以(通常应该)来自不同的人) 这些自定义首选项应该在PreferenceActivities以及PreferenceFragments中工作 更好的是,如果编辑文本的
我甚至不知道最好的方法是在PreferenceScreen中使用意图还是扩展DialogPreference或。。。谁知道呢。
现在,我的英语可能有问题,我最好借助图像(这是一系列动作)来解释我需要什么:
提前谢谢你 事实证明,DialogPreferences无法覆盖onActivityResult,这对于从联系人列表中选择联系人后获得结果至关重要 因此,我不得不辞职并找到其他解决办法。
一个简单的EditTextPreference是。。。对我的口味来说太简单了,我扩展了一个RingTonePreference,并将其弯曲到我的需要 您将需要:一个类(首选项本身)、一个可设置样式的属性(只是一个枚举,用于设置它是用来选择电话号码还是电子邮件地址)和首选项定义文件 我们开始: CLS_Prefs_Contact.java
/**
* CLS_Prefs_Contact class
*
* This is the class that allows for a custom Contact Picker Preference
* (auto refresh summary).
*
* @category Custom Preference
* @author Paranoid Eyes
* @copyright Paranoid Eyes
* @version 1.0
*/
package com.paranoideyes.contactpreference_rt;
/* ---------------------------------- Imports ------------------------------- */
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.preference.PreferenceManager;
import android.preference.RingtonePreference;
import android.provider.ContactsContract;
import android.util.AttributeSet;
/**
* @attr ref android.R.styleable#ContactPreference_contactInfo
*/
public class ContactPreference extends RingtonePreference
{
/* ----------------------------- Constants ------------------------------ */
/*
private static final String nsContact =
"http://schemas.android.com/apk/res/com.lucacrisi.contactpreference_rt";
*/
private static final String nsContact =
"http://schemas.android.com/apk/res-auto";
/* ----------------------------- Variables ------------------------------ */
//private static Contact_Info contactInfo = null;
private int contactInfo = 0;
private final String defaultSummary = "---";
/* ------------------------------ Objects ------------------------------- */
private static Context ctx = null;
private static SharedPreferences prefs = null;
/* ---------------------------- Constructors ---------------------------- */
public ContactPreference(final Context context, final AttributeSet attrs)
{
super(context, attrs);
ctx = context;
// Read attributes
contactInfo = attrs.getAttributeIntValue(nsContact, "contactInfo", 0);
//System.out.println("Constructor - " + contactInfo);
prefs = PreferenceManager.getDefaultSharedPreferences(ctx);
summary_Update();
}
/* ----------------------------- Overrides ------------------------------ */
@Override
public final boolean onActivityResult
(final int requestCode, final int resultCode, final Intent data)
{
boolean result = false;
if (super.onActivityResult(requestCode, resultCode, data))
{
if (data != null)
{
//
getContactInfo(data);
//
final Uri uri = data.getData();
if (callChangeListener(uri != null ? uri.toString() : ""))
{
result = true;
}
}
}
return result;
}
@Override
protected final void onPrepareRingtonePickerIntent(final Intent tnt)
{
tnt.setAction(Intent.ACTION_PICK);
tnt.setData(ContactsContract.Contacts.CONTENT_URI);
}
/* ------------------------------ Methods ------------------------------- */
private final void getContactInfo(final Intent data)
{
//final String noData = getString(R.string.missing_data);
//String result = noData;
String result = "";
final Cursor cur =
ctx.getContentResolver().query(data.getData(), null, null, null, null);
while (cur.moveToNext())
{
final String contactId =
cur.getString
(
cur.getColumnIndex
(
ContactsContract.Contacts._ID
)
);
//System.out.println("getContactInfo - " + contactInfo);
switch(contactInfo)
{
case 0: // phone
{
// Find the phone numbers
String hasPhone = cur.getString
(
cur.getColumnIndex
(
ContactsContract.Contacts.HAS_PHONE_NUMBER
)
);
if (hasPhone.equalsIgnoreCase("1"))
{
hasPhone = "true";
}
else
{
hasPhone = "false" ;
}
if (Boolean.parseBoolean(hasPhone))
{
final Cursor phones = ctx.getContentResolver().query
(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID +
" = " + contactId, null, null
);
String number = ""; //noData;
if (phones.getCount() > 0)
{
phones.moveToFirst();
number = phones.getString
(
phones.getColumnIndex
(
ContactsContract.CommonDataKinds.Phone.NUMBER
)
);
}
phones.close();
result = number;
//result = ((number == "") ? noData : number);
}
break;
}
case 1: // email
{
// Find the email addresses
final Cursor emails = ctx.getContentResolver().query
(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID +
" = " + contactId, null, null
);
String email = ""; //noData;
if (emails.getCount() > 0)
{
emails.moveToFirst();
email = emails.getString
(
emails.getColumnIndex
(
ContactsContract.CommonDataKinds.Email.DATA
)
);
}
emails.close();
result = email;
//result = ((email == "") ? noData : email);
break;
}
}
}
cur.close();
// Here do the magic and put the value into the Preferences
setting_Write(getKey(), result);
summary_Update();
}
private final static void setting_Write(final String key, final String value)
{
// Write the value
prefs.edit().putString(key, value).commit();
}
private final void summary_Update()
{
// Read the value and set the summary
String str = prefs.getString(getKey(), "");
if ("".equals(str))
{
str = defaultSummary;
}
setSummary(str);
}
}
res/values/attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CLS_Prefs_Contact">
<attr name="contactInfo">
<enum name="phone" value="0" />
<enum name="email" value="1" />
</attr>
</declare-styleable>
</resources>
res/xml/prefs.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:contact="http://schemas.android.com/apk/res-auto"
>
<com.paranoideyes.contactpreference_rt.CLS_Prefs_Contact
android:key="phone_nr"
android:title="@string/phone_nr"
contact:contactInfo="phone"
/>
<com.paranoideyes.contactpreference_rt.CLS_Prefs_Contact
android:key="email_ad"
android:title="@string/email_ad"
contact:contactInfo="email"
/>
</PreferenceScreen>
res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">ContactPreference Sample</string>
<string name="phone_nr">Choose a phone number</string>
<string name="summary_pn">Not set</string>
<string name="email_ad">Choose an email</string>
<string name="summary_ea">Not set</string>
</resources>
接触偏好样本
选择一个电话号码
未设定
选择一封电子邮件
未设定
这就是我的结局:
事实证明,DialogPreferences无法覆盖onActivityResult,这对于从联系人列表中选择联系人后获得结果至关重要 因此,我不得不辞职并找到其他解决办法。
一个简单的EditTextPreference是。。。对我的口味来说太简单了,我扩展了一个RingTonePreference,并将其弯曲到我的需要 您将需要:一个类(首选项本身)、一个可设置样式的属性(只是一个枚举,用于设置它是用来选择电话号码还是电子邮件地址)和首选项定义文件 我们开始: CLS_Prefs_Contact.java
/**
* CLS_Prefs_Contact class
*
* This is the class that allows for a custom Contact Picker Preference
* (auto refresh summary).
*
* @category Custom Preference
* @author Paranoid Eyes
* @copyright Paranoid Eyes
* @version 1.0
*/
package com.paranoideyes.contactpreference_rt;
/* ---------------------------------- Imports ------------------------------- */
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.preference.PreferenceManager;
import android.preference.RingtonePreference;
import android.provider.ContactsContract;
import android.util.AttributeSet;
/**
* @attr ref android.R.styleable#ContactPreference_contactInfo
*/
public class ContactPreference extends RingtonePreference
{
/* ----------------------------- Constants ------------------------------ */
/*
private static final String nsContact =
"http://schemas.android.com/apk/res/com.lucacrisi.contactpreference_rt";
*/
private static final String nsContact =
"http://schemas.android.com/apk/res-auto";
/* ----------------------------- Variables ------------------------------ */
//private static Contact_Info contactInfo = null;
private int contactInfo = 0;
private final String defaultSummary = "---";
/* ------------------------------ Objects ------------------------------- */
private static Context ctx = null;
private static SharedPreferences prefs = null;
/* ---------------------------- Constructors ---------------------------- */
public ContactPreference(final Context context, final AttributeSet attrs)
{
super(context, attrs);
ctx = context;
// Read attributes
contactInfo = attrs.getAttributeIntValue(nsContact, "contactInfo", 0);
//System.out.println("Constructor - " + contactInfo);
prefs = PreferenceManager.getDefaultSharedPreferences(ctx);
summary_Update();
}
/* ----------------------------- Overrides ------------------------------ */
@Override
public final boolean onActivityResult
(final int requestCode, final int resultCode, final Intent data)
{
boolean result = false;
if (super.onActivityResult(requestCode, resultCode, data))
{
if (data != null)
{
//
getContactInfo(data);
//
final Uri uri = data.getData();
if (callChangeListener(uri != null ? uri.toString() : ""))
{
result = true;
}
}
}
return result;
}
@Override
protected final void onPrepareRingtonePickerIntent(final Intent tnt)
{
tnt.setAction(Intent.ACTION_PICK);
tnt.setData(ContactsContract.Contacts.CONTENT_URI);
}
/* ------------------------------ Methods ------------------------------- */
private final void getContactInfo(final Intent data)
{
//final String noData = getString(R.string.missing_data);
//String result = noData;
String result = "";
final Cursor cur =
ctx.getContentResolver().query(data.getData(), null, null, null, null);
while (cur.moveToNext())
{
final String contactId =
cur.getString
(
cur.getColumnIndex
(
ContactsContract.Contacts._ID
)
);
//System.out.println("getContactInfo - " + contactInfo);
switch(contactInfo)
{
case 0: // phone
{
// Find the phone numbers
String hasPhone = cur.getString
(
cur.getColumnIndex
(
ContactsContract.Contacts.HAS_PHONE_NUMBER
)
);
if (hasPhone.equalsIgnoreCase("1"))
{
hasPhone = "true";
}
else
{
hasPhone = "false" ;
}
if (Boolean.parseBoolean(hasPhone))
{
final Cursor phones = ctx.getContentResolver().query
(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID +
" = " + contactId, null, null
);
String number = ""; //noData;
if (phones.getCount() > 0)
{
phones.moveToFirst();
number = phones.getString
(
phones.getColumnIndex
(
ContactsContract.CommonDataKinds.Phone.NUMBER
)
);
}
phones.close();
result = number;
//result = ((number == "") ? noData : number);
}
break;
}
case 1: // email
{
// Find the email addresses
final Cursor emails = ctx.getContentResolver().query
(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID +
" = " + contactId, null, null
);
String email = ""; //noData;
if (emails.getCount() > 0)
{
emails.moveToFirst();
email = emails.getString
(
emails.getColumnIndex
(
ContactsContract.CommonDataKinds.Email.DATA
)
);
}
emails.close();
result = email;
//result = ((email == "") ? noData : email);
break;
}
}
}
cur.close();
// Here do the magic and put the value into the Preferences
setting_Write(getKey(), result);
summary_Update();
}
private final static void setting_Write(final String key, final String value)
{
// Write the value
prefs.edit().putString(key, value).commit();
}
private final void summary_Update()
{
// Read the value and set the summary
String str = prefs.getString(getKey(), "");
if ("".equals(str))
{
str = defaultSummary;
}
setSummary(str);
}
}
res/values/attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CLS_Prefs_Contact">
<attr name="contactInfo">
<enum name="phone" value="0" />
<enum name="email" value="1" />
</attr>
</declare-styleable>
</resources>
res/xml/prefs.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:contact="http://schemas.android.com/apk/res-auto"
>
<com.paranoideyes.contactpreference_rt.CLS_Prefs_Contact
android:key="phone_nr"
android:title="@string/phone_nr"
contact:contactInfo="phone"
/>
<com.paranoideyes.contactpreference_rt.CLS_Prefs_Contact
android:key="email_ad"
android:title="@string/email_ad"
contact:contactInfo="email"
/>
</PreferenceScreen>
res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">ContactPreference Sample</string>
<string name="phone_nr">Choose a phone number</string>
<string name="summary_pn">Not set</string>
<string name="email_ad">Choose an email</string>
<string name="summary_ea">Not set</string>
</resources>
接触偏好样本
选择一个电话号码
未设定
选择一封电子邮件
未设定
这就是我的结局:
事实证明,DialogPreferences无法覆盖onActivityResult,这对于从联系人列表中选择联系人后获得结果至关重要 因此,我不得不辞职并找到其他解决办法。
一个简单的EditTextPreference是。。。对我的口味来说太简单了,我扩展了一个RingTonePreference,并将其弯曲到我的需要 您将需要:一个类(首选项本身)、一个可设置样式的属性(只是一个枚举,用于设置它是用来选择电话号码还是电子邮件地址)和首选项定义文件 我们开始: CLS_Prefs_Contact.java
/**
* CLS_Prefs_Contact class
*
* This is the class that allows for a custom Contact Picker Preference
* (auto refresh summary).
*
* @category Custom Preference
* @author Paranoid Eyes
* @copyright Paranoid Eyes
* @version 1.0
*/
package com.paranoideyes.contactpreference_rt;
/* ---------------------------------- Imports ------------------------------- */
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.preference.PreferenceManager;
import android.preference.RingtonePreference;
import android.provider.ContactsContract;
import android.util.AttributeSet;
/**
* @attr ref android.R.styleable#ContactPreference_contactInfo
*/
public class ContactPreference extends RingtonePreference
{
/* ----------------------------- Constants ------------------------------ */
/*
private static final String nsContact =
"http://schemas.android.com/apk/res/com.lucacrisi.contactpreference_rt";
*/
private static final String nsContact =
"http://schemas.android.com/apk/res-auto";
/* ----------------------------- Variables ------------------------------ */
//private static Contact_Info contactInfo = null;
private int contactInfo = 0;
private final String defaultSummary = "---";
/* ------------------------------ Objects ------------------------------- */
private static Context ctx = null;
private static SharedPreferences prefs = null;
/* ---------------------------- Constructors ---------------------------- */
public ContactPreference(final Context context, final AttributeSet attrs)
{
super(context, attrs);
ctx = context;
// Read attributes
contactInfo = attrs.getAttributeIntValue(nsContact, "contactInfo", 0);
//System.out.println("Constructor - " + contactInfo);
prefs = PreferenceManager.getDefaultSharedPreferences(ctx);
summary_Update();
}
/* ----------------------------- Overrides ------------------------------ */
@Override
public final boolean onActivityResult
(final int requestCode, final int resultCode, final Intent data)
{
boolean result = false;
if (super.onActivityResult(requestCode, resultCode, data))
{
if (data != null)
{
//
getContactInfo(data);
//
final Uri uri = data.getData();
if (callChangeListener(uri != null ? uri.toString() : ""))
{
result = true;
}
}
}
return result;
}
@Override
protected final void onPrepareRingtonePickerIntent(final Intent tnt)
{
tnt.setAction(Intent.ACTION_PICK);
tnt.setData(ContactsContract.Contacts.CONTENT_URI);
}
/* ------------------------------ Methods ------------------------------- */
private final void getContactInfo(final Intent data)
{
//final String noData = getString(R.string.missing_data);
//String result = noData;
String result = "";
final Cursor cur =
ctx.getContentResolver().query(data.getData(), null, null, null, null);
while (cur.moveToNext())
{
final String contactId =
cur.getString
(
cur.getColumnIndex
(
ContactsContract.Contacts._ID
)
);
//System.out.println("getContactInfo - " + contactInfo);
switch(contactInfo)
{
case 0: // phone
{
// Find the phone numbers
String hasPhone = cur.getString
(
cur.getColumnIndex
(
ContactsContract.Contacts.HAS_PHONE_NUMBER
)
);
if (hasPhone.equalsIgnoreCase("1"))
{
hasPhone = "true";
}
else
{
hasPhone = "false" ;
}
if (Boolean.parseBoolean(hasPhone))
{
final Cursor phones = ctx.getContentResolver().query
(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID +
" = " + contactId, null, null
);
String number = ""; //noData;
if (phones.getCount() > 0)
{
phones.moveToFirst();
number = phones.getString
(
phones.getColumnIndex
(
ContactsContract.CommonDataKinds.Phone.NUMBER
)
);
}
phones.close();
result = number;
//result = ((number == "") ? noData : number);
}
break;
}
case 1: // email
{
// Find the email addresses
final Cursor emails = ctx.getContentResolver().query
(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID +
" = " + contactId, null, null
);
String email = ""; //noData;
if (emails.getCount() > 0)
{
emails.moveToFirst();
email = emails.getString
(
emails.getColumnIndex
(
ContactsContract.CommonDataKinds.Email.DATA
)
);
}
emails.close();
result = email;
//result = ((email == "") ? noData : email);
break;
}
}
}
cur.close();
// Here do the magic and put the value into the Preferences
setting_Write(getKey(), result);
summary_Update();
}
private final static void setting_Write(final String key, final String value)
{
// Write the value
prefs.edit().putString(key, value).commit();
}
private final void summary_Update()
{
// Read the value and set the summary
String str = prefs.getString(getKey(), "");
if ("".equals(str))
{
str = defaultSummary;
}
setSummary(str);
}
}
res/values/attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CLS_Prefs_Contact">
<attr name="contactInfo">
<enum name="phone" value="0" />
<enum name="email" value="1" />
</attr>
</declare-styleable>
</resources>
res/xml/prefs.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:contact="http://schemas.android.com/apk/res-auto"
>
<com.paranoideyes.contactpreference_rt.CLS_Prefs_Contact
android:key="phone_nr"
android:title="@string/phone_nr"
contact:contactInfo="phone"
/>
<com.paranoideyes.contactpreference_rt.CLS_Prefs_Contact
android:key="email_ad"
android:title="@string/email_ad"
contact:contactInfo="email"
/>
</PreferenceScreen>
res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">ContactPreference Sample</string>
<string name="phone_nr">Choose a phone number</string>
<string name="summary_pn">Not set</string>
<string name="email_ad">Choose an email</string>
<string name="summary_ea">Not set</string>
</resources>
接触偏好样本
选择一个电话号码
未设定
选择一封电子邮件
未设定
这就是我的结局:
事实证明,DialogPreferences无法覆盖onActivityResult,这对于从联系人列表中选择联系人后获得结果至关重要 因此,我不得不辞职并找到其他解决办法。
一个简单的EditTextPreference是。。。对我的口味来说太简单了,我扩展了一个RingTonePreference,并将其弯曲到我的需要 您将需要:一个类(首选项本身)、一个可设置样式的属性(只是一个枚举,用于设置它是用来选择电话号码还是电子邮件地址)和首选项定义文件 我们开始: CLS_Prefs_Contact.java
/**
* CLS_Prefs_Contact class
*
* This is the class that allows for a custom Contact Picker Preference
* (auto refresh summary).
*
* @category Custom Preference
* @author Paranoid Eyes
* @copyright Paranoid Eyes
* @version 1.0
*/
package com.paranoideyes.contactpreference_rt;
/* ---------------------------------- Imports ------------------------------- */
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.preference.PreferenceManager;
import android.preference.RingtonePreference;
import android.provider.ContactsContract;
import android.util.AttributeSet;
/**
* @attr ref android.R.styleable#ContactPreference_contactInfo
*/
public class ContactPreference extends RingtonePreference
{
/* ----------------------------- Constants ------------------------------ */
/*
private static final String nsContact =
"http://schemas.android.com/apk/res/com.lucacrisi.contactpreference_rt";
*/
private static final String nsContact =
"http://schemas.android.com/apk/res-auto";
/* ----------------------------- Variables ------------------------------ */
//private static Contact_Info contactInfo = null;
private int contactInfo = 0;
private final String defaultSummary = "---";
/* ------------------------------ Objects ------------------------------- */
private static Context ctx = null;
private static SharedPreferences prefs = null;
/* ---------------------------- Constructors ---------------------------- */
public ContactPreference(final Context context, final AttributeSet attrs)
{
super(context, attrs);
ctx = context;
// Read attributes
contactInfo = attrs.getAttributeIntValue(nsContact, "contactInfo", 0);
//System.out.println("Constructor - " + contactInfo);
prefs = PreferenceManager.getDefaultSharedPreferences(ctx);
summary_Update();
}
/* ----------------------------- Overrides ------------------------------ */
@Override
public final boolean onActivityResult
(final int requestCode, final int resultCode, final Intent data)
{
boolean result = false;
if (super.onActivityResult(requestCode, resultCode, data))
{
if (data != null)
{
//
getContactInfo(data);
//
final Uri uri = data.getData();
if (callChangeListener(uri != null ? uri.toString() : ""))
{
result = true;
}
}
}
return result;
}
@Override
protected final void onPrepareRingtonePickerIntent(final Intent tnt)
{
tnt.setAction(Intent.ACTION_PICK);
tnt.setData(ContactsContract.Contacts.CONTENT_URI);
}
/* ------------------------------ Methods ------------------------------- */
private final void getContactInfo(final Intent data)
{
//final String noData = getString(R.string.missing_data);
//String result = noData;
String result = "";
final Cursor cur =
ctx.getContentResolver().query(data.getData(), null, null, null, null);
while (cur.moveToNext())
{
final String contactId =
cur.getString
(
cur.getColumnIndex
(
ContactsContract.Contacts._ID
)
);
//System.out.println("getContactInfo - " + contactInfo);
switch(contactInfo)
{
case 0: // phone
{
// Find the phone numbers
String hasPhone = cur.getString
(
cur.getColumnIndex
(
ContactsContract.Contacts.HAS_PHONE_NUMBER
)
);
if (hasPhone.equalsIgnoreCase("1"))
{
hasPhone = "true";
}
else
{
hasPhone = "false" ;
}
if (Boolean.parseBoolean(hasPhone))
{
final Cursor phones = ctx.getContentResolver().query
(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID +
" = " + contactId, null, null
);
String number = ""; //noData;
if (phones.getCount() > 0)
{
phones.moveToFirst();
number = phones.getString
(
phones.getColumnIndex
(
ContactsContract.CommonDataKinds.Phone.NUMBER
)
);
}
phones.close();
result = number;
//result = ((number == "") ? noData : number);
}
break;
}
case 1: // email
{
// Find the email addresses
final Cursor emails = ctx.getContentResolver().query
(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID +
" = " + contactId, null, null
);
String email = ""; //noData;
if (emails.getCount() > 0)
{
emails.moveToFirst();
email = emails.getString
(
emails.getColumnIndex
(
ContactsContract.CommonDataKinds.Email.DATA
)
);
}
emails.close();
result = email;
//result = ((email == "") ? noData : email);
break;
}
}
}
cur.close();
// Here do the magic and put the value into the Preferences
setting_Write(getKey(), result);
summary_Update();
}
private final static void setting_Write(final String key, final String value)
{
// Write the value
prefs.edit().putString(key, value).commit();
}
private final void summary_Update()
{
// Read the value and set the summary
String str = prefs.getString(getKey(), "");
if ("".equals(str))
{
str = defaultSummary;
}
setSummary(str);
}
}
res/values/attrs.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="CLS_Prefs_Contact">
<attr name="contactInfo">
<enum name="phone" value="0" />
<enum name="email" value="1" />
</attr>
</declare-styleable>
</resources>
res/xml/prefs.xml
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:contact="http://schemas.android.com/apk/res-auto"
>
<com.paranoideyes.contactpreference_rt.CLS_Prefs_Contact
android:key="phone_nr"
android:title="@string/phone_nr"
contact:contactInfo="phone"
/>
<com.paranoideyes.contactpreference_rt.CLS_Prefs_Contact
android:key="email_ad"
android:title="@string/email_ad"
contact:contactInfo="email"
/>
</PreferenceScreen>
res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">ContactPreference Sample</string>
<string name="phone_nr">Choose a phone number</string>
<string name="summary_pn">Not set</string>
<string name="email_ad">Choose an email</string>
<string name="summary_ea">Not set</string>
</resources>
接触偏好样本
选择一个电话号码
未设定
选择一封电子邮件
未设定
这就是我的结局:
当你需要更复杂的东西时,不要使用preferenceFragments——没有它会更简单。好吧,你看。。。我讨厌它说:“这个f#ing方法已经被弃用了”。谷歌的国家运动是反对一切。所以,我做了“好孩子”,在使用安卓2.2+的旧设备上使用PreferenceActivities,在使用安卓3.0+的安卓设备上使用PreferenceFragments;)当你需要更复杂的东西时,就不要使用preferenceFragments——没有它会更简单。。。我讨厌它说:“这个f#ing方法已经被弃用了”。谷歌的国家运动是反对一切。所以,我做了“好孩子”,在使用安卓2.2+的旧设备上使用PreferenceActivities,在使用安卓3.0+的安卓设备上使用PreferenceFragments;)当你需要更复杂的东西时,不要使用preferenceFragments——它将是si