我的应用程序中Global Dialog的最佳实践是什么?

Ken*_*nji 3 android dialog android-context

我的应用程序中有自定义对话框构建器,它将触发许多事件,例如:Asynctasks,Web服务消息,UI输入错误或来自没有活动上下文的服务.我总是习惯currentActivity在我的Application类中创建一个Activity .然后恢复他们坐的每一项活动currentActivity.

  @Override
    protected void onResume() {
        super.onResume();
        MyApplication.currentActivity = MainActivity.this;
Run Code Online (Sandbox Code Playgroud)

然后在创建对话框的情况下,我使用了该上下文.但我有一个问题.例如,我打开RegisterActivity,然后currentActivity更改为它.然后,当应用程序转到后台或某些其他活动打开的情况时,我的应用程序将在创建具有该上下文的对话框时崩溃.因此处理女巫活动currentActivity是一件令人头痛的事.我用Google搜索并发现有些人将CustomDialog嵌入到非布局激活中,然后打开该活动.但似乎不是很好的解决方案.

更新

例如,我有一个SMSManager类来处理我的所有发送短信.我想打开对话框,用户在发送短信之前选择了一些自定义选项.

那么Global Dialog在我的整个应用程序中的最佳实践是什么?

art*_*nig 5

首先 - 保存对活动(或Context一般)的引用是一种非常糟糕的做法.Android始终为您提供Context可用于创建对话框的对象的引用.在Activity它是对象本身(this),在Fragment您可以访问Context通过getActivity()getContext()在一个View- getContext().

如果您需要显示自定义类的对话框而没有引用Context确认,则可以Context使用上述方法提供对类的引用.

不要尝试显示任何对话框Service- 在显示任何对话框之前,请确保您的应用处于前台并且可见.您可以使用事件总线(或LocalBroadcastManager)将状态(错误,消息或其他)发送到您当前可见ActivityFragment.在这种情况下,"当前可见的活动或片段"正在ActivityFragment正在监听此类事件.开始收听onStart()并停止收听onStop()Activity或你的方法Fragment.如果您不想依赖任何正在运行的活动来显示对话框而又不想等到下次用户启动您的应用程序,我建议您使用通知而不是对话框.

鉴于Context您可以使用辅助对话框构建器类,您可以随意创建自定义对话框,如下所示:

public class DialogBuilder {
    private String title;
    private String message;
    private String primaryButtonTitle;
    private String secondaryButtonTitle;
    private Dialog.OnClickListener primaryButtonListener;
    private Dialog.OnClickListener secondaryButtonListener;
    private Activity context;
    private boolean showIcon;
    private boolean cancellable;

    public DialogBuilder(Activity context) {
        this.context = context;
    }

    public DialogBuilder setTitle(@StringRes int title) {
        this.title = context.getString(title);
        return this;
    }

    public DialogBuilder setTitle(String title) {
        this.title = title;
        return this;
    }

    public DialogBuilder setMessage(@StringRes int message) {
        this.message = context.getString(message);
        return this;
    }

    public DialogBuilder setMessage(String message) {
        this.message = message;
        return this;
    }

    public DialogBuilder setShowIcon() {
        showIcon = true;
        return this;
    }

    public DialogBuilder setPrimaryButton(@StringRes int title, Dialog.OnClickListener listener) {
        primaryButtonTitle = context.getString(title);
        primaryButtonListener = listener;
        return this;
    }

    public DialogBuilder setSecondaryButton(@StringRes int title, Dialog.OnClickListener listener) {
        secondaryButtonTitle = context.getString(title);
        secondaryButtonListener = listener;
        return this;
    }

    public DialogBuilder setCancellable(boolean cancellable) {
        this.cancellable = cancellable;
        return this;
    }

    public AlertDialog create() {
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
        View dialogView = LayoutInflater.from(context).inflate(R.layout.my_custom_dialog, null);        
        builder.setView(dialogView);

        // get your custom views here and configure them based on given settings (field values of this class)

        final AlertDialog dialog = builder.create();
        return dialog;
    }
}
Run Code Online (Sandbox Code Playgroud)

示例用法(在a中Fragment):

new DialogBuilder(getActivity())
    .setTitle(R.string.title)
    .setMessage(R.string.message)
    .setPrimaryButton(R.string.ok, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            // do something
            dialog.dismiss();           
        }
    })
    .setSecondaryButton(R.string.settings_cancel, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            // do something
            dialog.dismiss();           
        }
    }).create().show();
Run Code Online (Sandbox Code Playgroud)