偏好设置和确认对话框

6

我在使用对话框创建偏好设置时遇到了麻烦,网站上推荐的方法都不起作用。以下是我目前拥有的代码。在MainActivity中,我有这段代码:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_stage_1, menu);
    return true;
}

这将打开菜单,当您选择“设置”时,在下一个屏幕上只有一个偏好设置,它是从此preferences.xml创建的。

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

<Preference
    android:summary="clears all data"
    android:title="Reset Data" >
    <intent
        android:targetClass="com.example.myapp.settings.DialogActivity"
        android:targetPackage="com.example.myapp" >
    </intent>
</Preference>

我希望当我点击这个选项时,会弹出一个对话框,其中有“是”和“否”按钮,因此我可以在某个地方以编程方式定义按钮的操作。我该如何做到这一点?

3个回答

6
您可以扩展DialogPreference。覆盖onDialogClosed方法,在Dialog关闭时调用。该方法的参数指示用户是否选择了positivenegative按钮。 CustomDialogPreference.java
    public class CustomDialogPreference extends DialogPreference {
        public CustomDialogPreference(Context context, AttributeSet attrs) {
            super(context, attrs);

            // Set the layout here                
            setDialogLayoutResource(R.layout.custom_dialog);

            setPositiveButtonText(android.R.string.ok);
            setNegativeButtonText(android.R.string.cancel);

            setDialogIcon(null);
        }

        @Override
        protected void onDialogClosed(boolean positiveResult) {
            // When the user selects "OK", persist the new value
            if (positiveResult) {
                // User selected OK
            } else {
                // User selected Cancel
            }
        }

    }

preferences.xml

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
    <com.example.test1.CustomDialogPreference
        android:key="pref_dialog"
        android:title="dialog"/>
</PreferenceScreen>

您可以参考官方的设置文档

1
我想补充一点,您不一定需要覆盖布局。如果您只想在默认确认布局中显示自定义消息,则可以在构造函数中使用setDialogMessage()方法,并将资源ID设置为字符串值。 - William Brawner

1
在这种情况下,如果您可以使用Android Studio,您可以右键单击包含活动的文件夹,然后选择创建一个新的SettingsActivity
然后,在MainActivity的ActionBar的xml中,设置设置按钮如下:
<item android:id="@+id/action_settings"
    android:title="@string/action_settings"
    android:orderInCategory="99"
    android:showAsAction="ifRoom"/>

然后在ActionBar上设置设置按钮的监听器:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        //Start your new Activity here
        return true;
    }
    return super.onOptionsItemSelected(item);
}

您仍然可以使用我下面的代码在SettingsActivity中的Listener中构建AlertDialog

AlertDialog.Builder alert = new AlertDialog.Builder(self);
alert.setTitle(getResources().getString(R.string.action_about));
//Set up your AlertDialog and buttons
alert.setMessage(message);
alert.setNegativeButton("Okay", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
        // Canceled.
    }
});
alert.setCancelable(true);
alert.show();

我应该把这个方法放在哪里?如何启动拥有这个方法的类?请解释得更详细些。 - Sartheris Stormhammer
我希望在PreferenceActivity中显示此对话框,就像当我从MainActivity的菜单中选择设置时,PreferenceActivity会打开,并且第一个选项将是清除数据,因此我希望显示一个带有确认的对话框。 - Sartheris Stormhammer
好的。在这种情况下,如果您可以使用Android Studio,您可以右键单击包含活动的文件夹,然后选择创建一个新的“SettingsActivity”。您仍然可以在SettingsActivity中的监听器中使用我的代码来构建AlertDialog。 - paradite
我在我的答案中添加了一些额外的代码。 - paradite

0
如果您使用v7支持库,这有点复杂...但我更喜欢以下方法:
首先创建偏好设置。
<PreferenceCategory
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:title="@string/settings_absence_category_data">

        <Preference
            android:key="absence_data"
            android:title="@string/settings_absence_data_clear"></Preference>
    </PreferenceCategory>

然后绑定到片段偏好

 Preference clear = findPreference("absence_data");

        clear.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
            @Override
            public boolean onPreferenceClick(Preference preference) {
                alertForClearAbsenceData();

                return true;
            }
        });

alertForClearAbsenceData函数用于alertdialog的下面

 private void alertForClearAbsenceData(){

        AlertDialog.Builder alert = new AlertDialog.Builder(getMainActivity());

        alert.setTitle(getString(R.string.fragment_absence_alert_title));
        alert.setMessage(getString(R.string.fragment_absence_alert_message));

        alert.setCancelable(false);
        alert.setPositiveButton(R.string.fragment_absence_ok, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {


            }
        });
        alert.show();
    }

这是一个确认警告对话框的示例


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