【问题标题】:How to implement a confirmation (yes/no) DialogPreference?如何实现确认(是/否)DialogPreference?
【发布时间】:2011-07-04 21:16:24
【问题描述】:

如何实现显示简单是/否确认对话框的首选项?

例如,请参阅Browser->Setting->Clear Cache

【问题讨论】:

    标签: android android-preferences confirmation dialog-preference


    【解决方案1】:

    这是一个简单的alert dialog,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();
    

    【讨论】:

    • 我知道如何构建一个对话框,但我对偏好有疑问。
    • 您的问题是关于偏好的?好的。看这里:kaloer.com/android-preferences
    • 我已经阅读了这个来源。我可以创建订阅 OnClick 的自定义首选项并进行处理,但这是最简单的方法吗?
    • 我是这么认为的,至少我不知道还有什么更简单的方法。
    • 使用 import android.support.v7.app.AlertDialog;在没有主题的情况下获得更好的外观
    【解决方案2】:

    Android 带有一个内置的 YesNoPreference 类,该类完全符合您的要求(带有是和否选项的确认对话框)。见官方源码here

    不幸的是,它在 com.android.internal.preference 包中,这意味着它是 Android 私有 API 的一部分,您无法从您的应用程序中访问它(私有 API 类如有更改,恕不另行通知,因此谷歌不这样做的原因让您访问它们)。

    解决方案:只需从我提供的链接中复制/粘贴官方源代码,即可在您的应用程序包中重新创建该类。我已经尝试过了,它工作正常(没有理由不应该这样做)。

    然后您可以将其添加到您的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" />
    

    看起来像这样:

    【讨论】:

    • 很好的解决方案!但是这个类的构造函数之一有问题!它引用了一个资源属性(com.android.internal.R.attr.yesNoPreferenceStyle)!这是无法解决的。解决方法是什么?我必须在自己的项目中创建一个吗?!
    【解决方案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();
    }}
    

    如前所述,有多种方法可以做到这一点。这是您完成任务的一种方式,如果您觉得您已经得到了您想要的,请接受答案。

    【讨论】:

    • 谢谢!这几乎正​​是我的应用程序所需要的,因为我是从服务触发对话框,在我的情况下,我需要一个活动来托管对话框。
    • 爱它。恕我直言,冗长但经过批准且正确的方式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多