如何检查是否显示自定义DialogFragment?

时间:2019-01-29 18:28:43

标签: android notifications dialogfragment

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是否已显示?每次我创建此窗口的新对象时,都无法将其创建为Singleton,因为这会导致内存泄漏。

Found an answer in which,一个人建议使用弱链接来解决此问题:

  

您还可以在该单调中存储指向所示对话框的弱链接   类。使用这种方法,您可以检测到当前是您的对话框   是否显示。

也有这样的答案:

  

我建议在单实例类中保存到对话框的链接。在那里面   实例创建方法sureShowDialog(Context context)。那方法   将检查是否是当前显示的对话框。如果是,则可以显示   对话。在另一个Casr中,您可以将新数据传递给对话框。

但是,老实说,我不太了解如何在实践中使用这些技巧。请可以帮助实现这一目标或提出另一种方法?预先感谢。

2 个答案:

答案 0 :(得分:1)

您可以使用:

    val ft: FragmentTransaction = fragmentManager!!.beginTransaction()
    val prev: Fragment? = fragmentManager!!.findFragmentByTag("typeDialog")

    if (prev == null) {
        val fm = fragmentManager
        val courseTypeListDialogFragment =
            CourseTypeListDialogFragment()
        courseTypeListDialogFragment.isCancelable = false
        courseTypeListDialogFragment.setStyle(
            DialogFragment.STYLE_NO_TITLE,
            0
        )
        courseTypeListDialogFragment.setTargetFragment(this, 1)
        if (fm != null) {
            courseTypeListDialogFragment.show(ft, "typeDialog")
        }
    }

答案 1 :(得分:0)

您可以通过在DialogFragment内部调用isAdded ()或通过

来检查对话框片段是否正在显示
DialogFragment notificationEventDialog = NotificationEventDialog.newInstance();
notificationEventDialog.isAdded()

来自活动

如果将片段添加到活动,则在显示对话框片段的情况下会返回true。

您可以通过将System.currentTimeMillis()放在SharedPreferences中来存储最后显示的对话框片段日期

我想你有主意。