Как реализовать подтверждение (да / нет) DialogPreference?

Ответы:

293

Это простое диалоговое окно с предупреждением , Федерико предоставил вам сайт, на котором вы можете найти информацию.

Вот краткий пример того, как можно построить диалоговое окно с предупреждением.

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();
Мааалте
источник
3
Я знаю, как создать диалог, но мой вопрос о предпочтениях.
sh1ng
1
Ваш вопрос о предпочтениях? Ладно. Взгляните здесь: kaloer.com/android-preferences
Maaalte
1
Я уже читал этот источник. Я могу создать пользовательское предпочтение, подписанное на OnClick, и обработать его, но это самый простой способ?
sh1ng
Я так думаю, по крайней мере, я не знаю другого пути, который был бы проще.
Maaalte
1
используйте import android.support.v7.app.AlertDialog; для лучшего вида без темы
majurageerthan
9

Android поставляется со встроенным классом YesNoPreference, который делает именно то, что вы хотите (диалоговое окно подтверждения с вариантами «да» и «нет»). Смотрите официальный исходный код здесь .

К сожалению, это в com.android.internal.preference пакете, что означает, что он является частью частных API-интерфейсов Android, и вы не можете получить к нему доступ из своего приложения (частные классы 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" />

Это выглядит так:

Скриншот

XåpplI'-I0llwlg'I -
источник
1
Отличное решение! Но есть проблема с одним из конструкторов этого класса! Он ссылается на атрибут ресурса (com.android.internal.R.attr.yesNoPreferenceStyle)! Что не может быть решено. Какое обходное решение? Должен ли я создавать его в собственном проекте ?!
Рубенджон
3

Используйте Intent Preference, если вы используете предпочтительный xml-экран или если вы используете свой собственный экран, тогда код будет таким, как показано ниже

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();
}}

Как было сказано ранее, есть несколько способов сделать это. Это один из способов выполнения своей задачи. Примите ответ, если вы чувствуете, что получили то, что хотели.

ПравинДодиа
источник
Спасибо! Это почти именно то, что мне нужно для моего приложения, так как я запускаю диалог из службы, и в моем случае мне нужно действие для размещения диалога.
Ральф Риточ
Любить это. ИМХО многословный, но утвержденный и правильный способ
Джон