Как проверить, отображается ли пользовательский DialogFragment? - PullRequest
0 голосов
/ 29 января 2019

1) В моем приложении пользователь может получить много уведомлений от FCM
2) Если у пользователя открыто приложение, ему нужно , чтобы отобразить пользовательский DialogFragment
3) Если DialogFragment уже отображается, то при следующем получении уведомления необходимо запретить повторное отображение этого DialogFragment
4) Мой код диалога:

public final class NotificationEventDialog extends DialogFragment implements DialogInterface.OnKeyListener, View.OnClickListener {
    private Activity mCurrentActivity;
    private NotificationEventDialogListener mNotificationEventDialogListener;

    public interface NotificationEventDialogListener {
        void showEvent();
    }

    public NotificationEventDialog() {
    }

    public static NotificationEventDialog newInstance() {
        NotificationEventDialog notificationEventDialog = new NotificationEventDialog();
        notificationEventDialog.setCancelable(false);
        return notificationEventDialog;
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mCurrentActivity = (Activity)context;
        try {
            mNotificationEventDialogListener = (NotificationEventDialogListener) mCurrentActivity;
        } catch (ClassCastException e) {
            throw new ClassCastException(mCurrentActivity.toString() + " must implemented NotificationEventDialogListener");
        }
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        LayoutInflater inflater = LayoutInflater.from(mCurrentActivity);
        @SuppressLint("InflateParams") View view = inflater.inflate(R.layout.dialog_notification_event, null);

        Button btnNotificationEventYes = view.findViewById(R.id.notification_event_dialog_yes);
        btnNotificationEventYes.setOnClickListener(this);

        Button btnNotificationEventNo = view.findViewById(R.id.notification_event_dialog_no);
        btnNotificationEventNo.setOnClickListener(this);

        AlertDialog.Builder builder = new AlertDialog.Builder(mCurrentActivity);
        builder.setView(view);

        return builder.create();
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        if (getDialog() != null && getDialog().getWindow() != null) {
            getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);
            getDialog().setOnKeyListener(this);
        }
        return super.onCreateView(inflater, container, savedInstanceState);
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mCurrentActivity = null;
        mNotificationEventDialogListener = null;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.notification_event_dialog_yes:
                dismiss();
                mNotificationEventDialogListener.showEvent();
                break;
            case R.id.notification_event_dialog_no:
                dismiss();
                break;
        }
    }

    @Override
    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
            dismiss();
            return true;
        } else return false;
    }
} 

5) Каждый раз, когда я получаю уведомление от FCM, я создаю диалоговое окно:

DialogFragment notificationEventDialog = NotificationEventDialog.newInstance();  
notificationEventDialog.show(getSupportFragmentManager(), "");  

6) Как проверить, отображается ли DialogFragment? Everyвремя я создаю новый объект этого окна, и я не могу сделать его как Singleton, потому что это приводит к утечке памяти.

Найден ответ, в котором человек предлагает использовать слабые ссылки для решения этой проблемы:

Также вы можете сохранить слабую ссылку на отображаемый диалог в этомсинглетный класс.Используя такой метод, вы можете определить, отображается ли ваш диалог в данный момент или нет.

Был также такой ответ:

Предлагаю сохранить ссылку на диалог в классе одного экземпляра.В этом случае создайте метод sureShowDialog (Контекст контекста).Этот метод будет проверять текущее показанное диалоговое окно или нет.Если да, вы можете показать диалог.В другом casr вы можете передать новые данные вам в диалоге.

Но, честно говоря, Я не совсем понимаю, как использовать эти советы на практике .Пожалуйста, можете помочь с этой реализацией или предложить другой способ?Заранее спасибо.

1 Ответ

0 голосов
/ 29 января 2019

Вы можете проверить, отображается ли фрагмент диалога, вызвав isAdded () внутри DialogFragment или

DialogFragment notificationEventDialog = NotificationEventDialog.newInstance();
notificationEventDialog.isAdded()

из действия

Возвращается значение true, если фрагментдобавлен в Activity, в случае фрагмента диалога - отображается.

Вы можете сохранить дату последнего показанного фрагмента диалога, поместив System.currentTimeMillis() в SharedPreferences

Я думаю, вы поняли идею.

...