Android 如何制作在EditText旁边显示按钮的DialogPreference?

Android 如何制作在EditText旁边显示按钮的DialogPreference?,android,button,android-edittext,preference,Android,Button,Android Edittext,Preference,有一个问题让我抓狂 我需要有两个稍微不同的(可以是参数化的)和非常具体的偏好类型 一个是编辑文本,旁边有一个按钮。 EditText可用于输入(修改)电话号码,而该按钮可打开“联系人”对话框并可用于选择联系人号码 另一个偏好非常相似,如果不完全相同,但允许您从另一个联系人中选择电子邮件(并不是说电话和电子邮件来自同一个联系人,它们可以(通常应该)来自不同的人) 这些自定义首选项应该在PreferenceActivities以及PreferenceFragments中工作 更好的是,如果编辑文本的

有一个问题让我抓狂

我需要有两个稍微不同的(可以是参数化的)和非常具体的偏好类型

一个是编辑文本,旁边有一个按钮。 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