在我的应用程序中,一些对话框同时从不同的地方打开。 (有些对话框是其他AlertDialogs的自构建片段)这会导致其中一些消失,因为最后一个被调用的对话框会关闭之前打开的所有对话框。
是否有一种很好的方法让他们排队并在彼此之后展示,而不是像这样出现故障?
我正在考虑创建自己的对话框类而不是处理对话框,它会加载下一个对话框并在队列中没有任何内容时进行处理。我希望有一种更简单的方法可以解决我的问题,而不需要付出太多努力。
答案 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