DialogPreference не должен закрываться, если не выбрана ни одна опция - PullRequest
3 голосов
/ 01 февраля 2010

У меня есть DialogPreference, и я хочу, чтобы пользователь не закрывал его при нажатии «ОК», «Отмена» и т. Д.

Как мне это сделать?

EDIT:

Я попытался добраться до кнопки ОК, чтобы отключить ее при создании диалога. Но я не смог этого сделать: (

Ответы [ 6 ]

8 голосов
/ 14 мая 2012

Решение довольно простое.Перезапишите showDialog и установите свой собственный слушатель щелчка для кнопок, которые вы хотите перехватить.

   @Override
    protected void showDialog(Bundle bundle) {
        super.showDialog(bundle);
        Button pos = ((AlertDialog) getDialog()).getButton(DialogInterface.BUTTON_POSITIVE);
        pos.setOnClickListener(...);
    }

В прослушивателе кликов вы можете выполнить желаемую проверку.

3 голосов
/ 06 февраля 2010

Можно настроить пользовательский диалог, в котором вы определяете свои собственные кнопки (ОК и Закрыть).

public class YourClass implements OnClickListener {
    private Button DialogButton;
    private Dialog dialog;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.MainLayout);

        /* Your code... */

        DialogButton = (Button) findViewById(R.id.DialogButtonId);
        DialogButton.setOnClickListener(this);
    }

    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.DialogButtonId:
            LayoutInflater inflater = LayoutInflater.from(YourClass.this);
            final View inflay = inflater.inflate(R.layout.DialogLayout, (ViewGroup) findViewById(R.id.RootIdOfDialogLayout));

            TextView YourTextView = (TextView) inflay.findViewById(R.id.TextViewId);

            Button cancel = (Button) inflay.findViewById(R.id.CancelButtonId);      
            cancel.setOnClickListener(YourClass.this);

            Button ok = (Button) inflay.findViewById(R.id.OkButtonId);      
            ok.setOnClickListener(YourClass.this);

            dialog = new Dialog(YourClass.this);
            dialog.setContentView(inflay);
            dialog.setTitle(getString(R.string.TitleStringId));
            dialog.show();
            break;
        case R.id.CancelButtonId:
            /* Checking if the user selected an option if true call dialog.dismiss() */
            break;
        case R.id.OkButtonId:
            /* Here handle your preferences (e.g. putString(String key, String value)) */
            /* Checking if the user selected an option if true call dialog.dismiss() */
            break;
        }
    }
}

Проверьте http://developer.android.com/reference/android/content/SharedPreferences.Editor.html, чтобы удовлетворить ваши предпочтения в onClick. Я не тестировал этот код, просто написал его, чтобы показать вам, как вы можете его решить!

Диалог остается открытым до тех пор, пока вы не вызовите dialog.dismiss () ;. В этом случае вам нужно будет создать раскрывающееся меню, опросы или все, что вы хотите отобразить в файле макета. После нажатия «ОК» или «Отмена» необходимо проверить, сделал ли пользователь выбор, и проанализировать его в своих предпочтениях. (проверьте ссылку выше)

Rgds Лэйн

1 голос
/ 11 февраля 2010

Вы можете увидеть исходный код DialogPreferences здесь:
https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/preference/DialogPreference.java
А затем скопируйте большую часть кода в свой код, изменив код по мере необходимости.

1 голос
/ 02 февраля 2010

Вы можете попробовать открыть его снова.

Почему вы хотите запретить пользователям закрывать диалог? Пользователи должны иметь возможность «полностью» контролировать свое устройство.

0 голосов
/ 11 февраля 2010

В хорошем пользовательском интерфейсе должна быть уже выбрана опция / опция по умолчанию (ранее введенные пользователем опции или программа по умолчанию).

Представление диалогового окна с просьбой изменить в настройках без указания того, что у вас уже есть, является плохим дизайном интерфейса.

Таким образом, если пользователь нажимает кнопку «Отмена», ничего не меняется и он видит выбранную опцию. Если они не вносят изменений и нажимают кнопку ОК, то на самом деле ничего не меняется.

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

0 голосов
/ 07 февраля 2010

Как насчет переопределения метода onDismiss() и реализации метода canExit() с валидациями, которые вы хотите получить? Например. :

public class MyDialogPref extends DialogPreference {

  @override public void onDismiss(DialogInterface dialog) {
    if (canExit()) {
      super.onDismiss(dialog);
    }
  }
  ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...