У меня проблема с тем, что я не могу закрыть всплывающее окно в моем Android приложении (Xamarin. Android). Вероятно, это связано со странным поведением ОС Device Android. Я сталкиваюсь с этой проблемой, только когда я подключаю устройство (Honeywell CN80 Android OS 8) к подставке для зарядки docker. Если у него есть всплывающее окно / фрагмент, и если устройство подключено к docker, оно вызывает Черный экран с просто свиданием в приложении. Как показано ниже: Экран после подключения к зарядной подставке
//BasePopUp
// Under public abstract class BasePopup : DialogFragment, IDialogInterfaceOnKeyListener
public override void OnDismiss(IDialogInterface dialog)
{
base.OnDismiss(dialog);
if (null != ViewModel)
{
ViewModel.OnViewDisapper();
}
}
public override void OnPause()
{
base.OnPause();
// CurrentPopup = this;
}
public override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
BlissBoldFont = Typeface.CreateFromAsset(Context.Assets, "Fonts/bliss-bold.ttf");
BlissHeavyFont = Typeface.CreateFromAsset(Context.Assets, "Fonts/bliss-heavy.ttf");
BlissRegularFont = Typeface.CreateFromAsset(Context.Assets, "Fonts/bliss-regular.ttf");
if (null != ViewModel)
{
ViewModel.OnViewCreated(null);
}
}
public override void OnActivityCreated(Bundle savedInstanceState)
{
base.OnActivityCreated(savedInstanceState);
CurrentPopup = this;
Dialog.SetOnKeyListener(CurrentPopup);
}
Момент подключения к зарядке называется серией методов жизненного цикла Fragment -> OnPause -> OnCreate -> OnActivityCreated -> OnPause -> OnDismiss My Activity также создается заново.
Когда я помещаю приложение в фоновый режим или блокирую экран нажатием кнопки питания, я не сталкиваюсь с этой проблемой. Вызываемые события -> OnPause
Как мне избежать этого поведения, когда я подключаю устройство к зарядной подставке, так как такое поведение портит экземпляр Fragment.
public class AppCompatDialogService : IDialogService
{
private static AlertDialogInfo CreateDialog(string content, string title, string okText = null, string cancelText = null, Action<bool> afterHideCallbackWithResponse = null)
{
var tcs = new TaskCompletionSource<bool>();
var builder = new AlertDialog.Builder(BaseAppCompatActivity.CurrentActivity);
builder.SetMessage(content);
// SOme Logic
builder.SetOnDismissListener(new OnDismissListener(() =>
{
tcs.TrySetResult(false);
if (afterHideCallbackWithResponse == null)
return;
afterHideCallbackWithResponse(false);
}));
dialog = builder.Create();
return new AlertDialogInfo
{
Dialog = dialog,
Tcs = tcs
};
}
private struct AlertDialogInfo
{
public AlertDialog Dialog;
public TaskCompletionSource<bool> Tcs;
}
private sealed class OnDismissListener : Java.Lang.Object, IDialogInterfaceOnDismissListener
{
private readonly Action _action;
public OnDismissListener(Action action)
{
_action = action;
}
public void OnDismiss(IDialogInterface dialog)
{
_action();
}
}
}
public void Dismiss(string popupKey)
{
if(BaseAppCompatActivity.CurrentActivity != null)
{
BaseAppCompatActivity.CurrentActivity.RunOnUiThread(() =>
{
if (_popupHeirarchy.TryGetValue(popupKey, out BasePopup currentPopup))
if (null != currentPopup)
{
try
{
currentPopup.DismissAllowingStateLoss();
}
catch (Exception)
{
//
}
}
}
});
}
}
// From PopUpViewmodel
private void OkButtonClickedHandler()
{
PopupNavigationService.Dismiss(ViewModelLocator.KEY_POPUP_ERROR);
// Trying to close the "Relocation Success" popup, to clear existing ack popup instances
PopupNavigationService.Dismiss(ViewModelLocator.KEY_POPUP_RELOCATION_STATUS);
if (OkClickHandler != null)
{
OkClickHandler?.Invoke(null, new EventArgs());
}
ErrorDialogEventArg.IsPopUpDismissed = true;
ErrorDialogHandler(this, ErrorDialogEventArg);
}