【问题标题】:How to raise one DialogFragment above another?如何将一个 DialogFragment 提升到另一个之上?
【发布时间】:2015-07-01 09:41:22
【问题描述】:

假设我有几个对话框片段,这些片段是为了响应可以按任何顺序到达的消息和事件而显示的。通常,显示的最后一个对话框将位于顶部。 有没有办法在现有的下方显示对话框片段,或在显示后更改其 z 顺序?

我的应用一次显示多个对话框的情况应该很少见,但这种情况可能会发生。只要有一个特定的对话框可见,它就应该始终位于顶部。

【问题讨论】:

  • 有人愿意解释反对意见吗?
  • 那些反对票根本没有意义。 +1 以平衡。另外,我正在调查这个问题,这绝对是一个有趣的问题。
  • 为什么要显示多个对话框?我会推荐一种不同的方法,因为在一堆对话框上单击“关闭”将是一种非常糟糕的体验。考虑一种不同的方法,例如保持对话框出现时的显示优先级的对话框管理器。
  • @Cookster 您的建议有何不同,我将如何实施?
  • 创建一个对话框片段管理器,它可以检查是否有任何对话框可见。当您调用“showDialog(dialog_id)”时,让它自动评估新的 dialog_id 是否优先于现有对话框。如果是这样,请关闭当前并显示新对话框。如果没有,请放弃该事件。或者,根据实施情况,如果优先级同等重要,您可以使用附加信息更新现有对话框。

标签: android android-dialogfragment


【解决方案1】:

对话框创建应用程序子窗口。 Android 的窗口管理器 (WindowManagerService) 会根据其类型自动计算窗口的 z 顺序并将其存储在 WindowStatemLayer 字段中。内部 Android 类可以访问此字段并有时会更改窗口的 z-order,但此 API 不会暴露给 Android SDK。因此,似乎影响对话框 z 顺序的唯一方法是重新创建它。

我上面写的所有内容只是对Android源代码的简要调查,所以我可能错了。也许有一些 hacky 方法可以使用反射和访问私有字段和方法来做你想做的事情。但我不确定尝试去做是否是个好主意。在我看来,最好只有一个对话框甚至活动,并在其中管理片段。

【讨论】:

  • 可以通过反射修改吗?
  • @dextor,窗口管理器工作在 Android 运行时进程中,因此无法通过反射访问。
猜你喜欢
  • 2020-11-17
  • 1970-01-01
  • 2015-10-24
  • 2023-03-28
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多