按顺序显示android对话框

时间:2018-03-15 20:27:10

标签: android dialog

在我的应用程序中,一些对话框同时从不同的地方打开。 (有些对话框是其他AlertDialogs的自构建片段)这会导致其中一些消失,因为最后一个被调用的对话框会关闭之前打开的所有对话框。

是否有一种很好的方法让他们排队并在彼此之后展示,而不是像这样出现故障?

我正在考虑创建自己的对话框类而不是处理对话框,它会加载下一个对话框并在队列中没有任何内容时进行处理。我希望有一种更简单的方法可以解决我的问题,而不需要付出太多努力。

2 个答案:

答案 0 :(得分:6)

你可以尝试一个你自己的问题所暗示的解决方案;一个队列。此解决方案应适用于扩展Dialog类的任何对话框。

为此,请将Dialog队列作为全局变量添加到您的活动中:

LinkedBlockingQueue<Dialog> dialogsToShow = new LinkedBlockingQueue<>();

除了上述内容之外,在想要显示对话框的Activity中,实现一个名为showDialog()的方法,该方法接受目标对话框作为参数。此方法将对话框添加到队列中,并确保对话框调用队列中的下一个对话框,以便在解除后显示。

void showDialog(final Dialog dialog) {
        if(dialogsToShow.isEmpty()) {
            dialog.show();
        }
        dialogsToShow.offer(dialog);
        dialog.setOnDismissListener((d) -> {
            dialogsToShow.remove(dialog);
            if(!dialogsToShow.isEmpty()) {
                dialogsToShow.peek().show();
            }
        }); 
}

请注意,我没有测试上面的代码。

答案 1 :(得分:1)

据我所知,在这种情况下,你实际上不必在这里实现自己的Dialog实现。您只需在sqlite数据库或其他位置维护自己的队列数据结构。当弹出一个对话框时,显示队列中的第一个对话框,然后按下肯定按钮,您需要将刚刚显示的内容出列,然后显示下一个,直到队列为空。

当您的队列中没有剩余其他内容时,请致电dialog.dismiss()。这不需要实现您自己的自定义对话框。您可以在onShowListener添加AlertDialog,然后您可以覆盖该按钮的onClickListener

final AlertDialog dialog = new AlertDialog.Builder(context)
        .setView(v)
        .setTitle(R.string.my_title)
        .setPositiveButton(android.R.string.ok, null) // Set to null. We override the onclick
        .setNegativeButton(android.R.string.cancel, null)
        .create();

dialog.setOnShowListener(new DialogInterface.OnShowListener() {

    @Override
    public void onShow(DialogInterface dialogInterface) {

        Button button = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE);
        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                // TODO: Show content and dequeue

                // Dismiss once all contents are shown 
                dialog.dismiss();
            }
        });
    }
});

dialog.show();

希望有所帮助。

<强>更新

据我所知,每次创建新内容时,都需要显示Dialog新内容和新布局。在这种情况下,您可能会考虑以多种方式实现此行为。我建议使用LocalBroadcastManager

Activity中,创建BroadcastReceiver并在onCreate功能中注册。

@Override
public void onCreate(Bundle savedInstanceState) {

  ...

  // Register to receive messages.
  // We are registering an observer (mMessageReceiver) to receive Intents
  // with actions named "open-next-dialog".
  LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver,
      new IntentFilter("open-next-dialog"));
}

// Our handler for received Intents. This will be called whenever an Intent
// with an action named "open-next-dialog" is broadcasted.
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    // Get extra data included in the Intent
    String message = intent.getStringExtra("message");
    int layoutId = intent.getIntExtra("layout_id");
    showDialog(layoutId, message);
  }
};

@Override
protected void onDestroy() {
  // Unregister since the activity is about to be closed.
  LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
  super.onDestroy();
}

现在,当点击Dialog时,您需要在解除Dialog后发送广播。因此,onClick的{​​{1}}功能会如下所示。

Dialog

不要忘记在@Override public void onClick(View view) { // TODO: Do whatever you want to do in your onClick // And then Dismiss the dialog dialog.dismiss(); openNextDialogIfAny(); } 添加openNextDialogIfAny功能,这会触发下一个Activity

Dialog