【发布时间】:2014-04-12 11:19:40
【问题描述】:
让我们看看这种情况:您在屏幕上打开了一个带有 DONE 和 DISCARD 选项的 CAB,并且您将不接受某个字段的错误值。因此,用户应该填写一个有效值(然后按 Back/Done 以使其被接受)或按 CAB 上的 Discard。
按下 DONE 会立即启动 onDestroyActionMode(),然后关闭 CAB。
所以,这是启动有效性检查的地方(在onBackPressed() 旁边)。
问题是,如果在那里创建一个新的 ActionMode(如果表单有效性检查失败),则将启动递归循环(因为新的 CAB 将首先开始关闭旧的 CAB,依此类推) --> StackOverflowError.
我尝试创建一个状态变量来防止 StackOverflowError,但在这种情况下,它只会每秒钟工作一次(并且只有 onBackPressed()):-/
所以,问题:我如何在调用onDestroyActionMode() 后立即保持 CAB 处于打开状态(或如何重新打开新的 CAB)?
【问题讨论】:
-
你应该重新考虑你当前的逻辑。从用户体验的角度来看,当用户输入错误时重新打开 CAB 听起来并不清楚(因为我认为 CAB 不适合数据输入表单)。您可能希望在用户输入数据时当场进行验证,并且如果用户仍然继续单击完成,则向他显示输入不正确的消息(尽管看到实时有效性指示器可能会让他不单击完成)。
-
感谢您的评论。 CAB 是这种场景(创建条目)的合适模式。有问题的字段已经具有验证和错误指示。问题是正确的操作是在用户按下后退按钮时始终保存/创建数据(与完成相同),但错误禁止完成此操作(例如,由于键违规)。因此,在错误按下 Back/Done 之后想要/需要保留 CAB。
-
我知道另一种可能性:在按下 Back/Done 时丢弃错误数据并通知用户,但这似乎有点笨拙,因为用户确实有意图(编辑/创建条目)并进行自动丢弃似乎过于轻率了。
-
“CAB 是这种场景的合适模式(创建条目)”——DONE & DISCARD 不是动作模式/CAB,而是一个程式化的动作栏,正如 Roman Nurik 描述的那样以前:plus.google.com/u/0/+RomanNurik/posts/R49wVvcDoEW
标签: android contextual-action-bar android-actionmode