如何实现一个确认(是/否)的DialogPreference?

119

如何实现一个偏好设置来显示简单的是/否确认对话框?

可以参考浏览器->设置->清除缓存的示例。

3个回答

337

这是一个简单的警报对话框,Federico 给了你一个可以查找信息的网站。

这里是一个构建警报对话框的简短示例。

new AlertDialog.Builder(this)
.setTitle("Title")
.setMessage("Do you really want to whatever?")
.setIcon(android.R.drawable.ic_dialog_alert)
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {

    public void onClick(DialogInterface dialog, int whichButton) {
        Toast.makeText(MainActivity.this, "Yaay", Toast.LENGTH_SHORT).show();
    }})
 .setNegativeButton(android.R.string.no, null).show();

4
我知道如何建立对话,但我有关于偏好的问题。 - sh1ng
1
你的问题是关于偏好设置吗?好的。请看这里:http://www.kaloer.com/android-preferences - Maaalte
1
我已经阅读了这个源代码。我可以创建自定义首选项并订阅OnClick来处理它,但这是否是最简单的方法? - sh1ng
浏览器源代码本身使用onclicklisteners。 - Maaalte
1
使用import android.support.v7.app.AlertDialog;可以在没有主题的情况下获得更好的外观。 - majurageerthan
显示剩余3条评论

9
Android内置了一个名为YesNoPreference的类,可以实现您需要的功能(确认对话框提供是和否两个选项)。您可以在这里查看官方源代码:https://github.com/android/platform_frameworks_base/blob/master/core/java/com/android/internal/preference/YesNoPreference.java
不幸的是,这个类位于com.android.internal.preference包中,也就是说它是Android私有API的一部分,您无法从应用程序中访问它(私有API类可能随时更改,这也是Google不允许访问的原因)。
解决方法:只需将我提供链接中的官方源代码复制/粘贴到您的应用程序包中重新创建该类即可。我已经尝试过,可以正常工作(没有理由它不能工作)。
然后,您可以像添加任何其他首选项一样将其添加到您的preferences.xml文件中。例如:
<com.example.myapp.YesNoPreference
    android:dialogMessage="Are you sure you want to revert all settings to their default values?"
    android:key="com.example.myapp.pref_reset_settings_key"
    android:summary="Revert all settings to their default values."
    android:title="Reset Settings" />

这看起来像这样:

截图


1
很棒的解决方案!但是这个类的其中一个构造函数存在问题!它引用了一个资源attr(com.android.internal.R.attr.yesNoPreferenceStyle)!这个资源无法解析。有什么解决方法吗?我需要在自己的项目中创建一个吗?! - reubenjohn

3
如果您正在使用偏好设置XML屏幕,则可以使用Intent Preference。如果您正在使用自定义屏幕,则代码如下所示。
intentClearCookies = getPreferenceManager().createPreferenceScreen(this);
    Intent clearcookies = new Intent(PopupPostPref.this, ClearCookies.class);

    intentClearCookies.setIntent(clearcookies);
    intentClearCookies.setTitle(R.string.ClearCookies);
    intentClearCookies.setEnabled(true);
    launchPrefCat.addPreference(intentClearCookies);

然后创建一个类似下面的活动类,因为不同的人有不同的方法,所以您可以使用任何您喜欢的方法,这只是一个例子。

public class ClearCookies extends Activity {


@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    showDialog();
}

/**
 * @throws NotFoundException
 */
private void showDialog() throws NotFoundException {
    new AlertDialog.Builder(this)
            .setTitle(getResources().getString(R.string.ClearCookies))
            .setMessage(
                    getResources().getString(R.string.ClearCookieQuestion))
            .setIcon(
                    getResources().getDrawable(
                            android.R.drawable.ic_dialog_alert))
            .setPositiveButton(
                    getResources().getString(R.string.PostiveYesButton),
                    new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog,
                                int which) {
                            //Do Something Here

                        }
                    })
            .setNegativeButton(
                    getResources().getString(R.string.NegativeNoButton),
                    new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog,
                                int which) {
                            //Do Something Here
                        }
                    }).show();
}}

正如之前所述,有许多方法可以完成这个任务。这是其中一种方法,请在您满意得到所需内容时接受该答案。


谢谢!这几乎是我为我的应用程序所需要的,因为我正在从服务触发对话框,在我的情况下,我需要一个活动来托管对话框。 - Ralph Ritoch
喜欢它。在我看来,冗长但经过批准和正确的方式。 - John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接