如何检测是否已存在ActionMode

9
我在视图中有多个小部件,每个小部件需要自己的ActionMode。我发现当用户轻触操作栏之外的区域时,ActionMode不会自动关闭。因此,用户很容易在一个控件上启动一个ActionMode,然后在另一个控件上轻触(在我的情况下是长按),从而在第一个Actionbar的顶部堆叠第二个ActionBar。这会造成编程逻辑混乱。
我可以使用活动级成员变量跟踪当前的ActionMode,如果需要新的ActionMode,则关闭当前的ActionMode。但是,这样会使我的代码难以阅读和维护。而且,我更希望在用户轻触操作栏之外的任何内容时立即将其关闭。
有没有好的建议来处理这个问题?
1个回答

8

我之前也遇到过这个问题,根据我的了解,在不保存当前操作模式状态的情况下是无法跟踪它的。然而,我认为一个有适当名称的变量并不会让你的代码变得混乱。


好的,撇开混乱不谈,假设用户点击了一个你没有子类化的EditText。那么你该如何取消现在不合适的操作栏? - Peri Hartman
好的,如果我理解正确的话...我这样做了:实现了全局变量ActionMode mMode;,在onCreateActionMode(...)方法中填充它的当前操作模式,然后当我需要退出当前操作模式时,只需调用mMode.finish()即可。 - user1049280
我明白了。但是你怎么知道何时调用finish()呢?也就是说,用户可以在许多地方点击;你是否要子类化每个对象并检查MotionEvent.ACTION_DOWN,然后调用finish()?这将极易出错,这些代码片段会散布在各个地方。 - Peri Hartman
这要看情况,例如,在控制元素下面的主布局中添加透明视图match_parent,并处理用户的点击事件。 - user1049280
听起来不错。如果我理解正确,这还有点棘手:透明视图需要检查点击位置,并以某种方式知道它是否在启动操作模式的小部件上方;如果不是,则“完成”操作模式。我会将您的答案标记为正确,因为听起来不错,而且我有一种预感没有更好的方法。 - Peri Hartman
非常感谢!对我有用。 - Amit Kumar Khare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接