Я использую AlertDialog
(полное раскрытие: использую React Native, но здесь используется собственный код и мост через API собственных модулей, поэтому я не думаю, что RN вызывает проблему) в приложении, которое я разрабатываю для отображения меню элементов, которое отлично работает во всех случаях. Я разработал его с помощью симулятора Pixel 2 (API 28, Android 9). Однако при тестировании на устройстве Samsung (Galaxy S4, Android 5) диалоговое окно нельзя закрыть, коснувшись фона приложения; Отменить могу только нажатием кнопки назад. Вот код, который я использую:
@ReactMethod
public void showDialog(ReadableArray labelsReadableArray, final Promise promise) {
final String[] labels = getLabels(labelsReadableArray);
new AlertDialog.Builder(getCurrentActivity())
.setItems(labels, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int itemIndex) {
dialog.dismiss();
promise.resolve(itemIndex);
}
})
.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
promise.reject("dialog was closed");
}
}).setCancelable(true)
.show();
}
и в коде React Native я вызываю:
NativeModules.AndroidPicker.showDialog(labels)
.then((index) => /* JS/redux action to process the change)
.catch(err => console.info(err))
Почему устройство Samsung не отменяет диалоговое окно при нажатии на фон, в то время как другие телефоны Android это делают? Как я могу это исправить?
У меня нет проблем с TouchWiz Oreo с отменяемыми диалогами. Вы пробовали использовать эмулятор на Lollipop, чтобы узнать, не связана ли это с проблемой Samsung?
@TheWanderer да, я запустил Nexus 4 с Lollipop, диалог можно отменить. ChristopheCVB, .setDismissable(true)
недоступен и выдает ошибку.
Это поддержка AlertDialog или AlertDialog фреймворка (содержит ли строка импорта support
или нет)?
проверьте есть ли setCanceledOnTouchOutside(true)
?
@TheWanderer Два импорта для AlertDialog - это import android.app.AlertDialog;
и import android.content.DialogInterface;
, поэтому нет support
. Амия, я нашла этот метод раньше, но он недоступен.
Тогда вам следует попробовать использовать версию поддержки: developer.android.com/reference/android/support/v7/app/…. Возможно, вам потребуется добавить для него зависимость. Я не уверен, использует ли React Gradle или нет.
Вы можете использовать следующее решение, чтобы закрыть AlertDialog
, нажав на фон на устройствах Samsung:
AlertDialog alertDialog;
alertDialog = new AlertDialog.Builder(this).create();
alertDialog.setCanceledOnTouchOutside(true);
.setDismissable(true)