首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检测ActionMode嵌套

检测ActionMode嵌套
EN

Stack Overflow用户
提问于 2013-05-15 22:27:34
回答 1查看 1.1K关注 0票数 1

我在应用程序中使用了一些自定义的ActionModes。当操作模式关闭时,我会做一些内务工作,比如关闭相关视图、更新更改等。我检测到OnDestroyActionMode中的操作模式已关闭。

我的问题是,在我的一些ActionModes中,用户可能会触发另一个系统操作模式(文本复制/粘贴/选择)。在这种情况下,onDestroyActionMode被调用,我错误地认为用户已经完成了第一个操作模式,而不是实现“堆栈”功能,所以我可以忽略这个onDestroyActionMode,让用户编辑/剪切/等等文本,然后在完成后重新打开前一个操作模式。

我如何才能做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-02 04:51:47

进一步说明你的情况:在蜂巢之前,TextView上的longPress将会弹出一个带有选项的窗口(如“选择单词”、“全选”和“将”某个单词“添加到字典”),而不会影响任何现有的ActionMode,无论是在显示时还是在取消时(通过按back)。所以这不是一个真正的问题,预蜂窝。

关于HTC Sense的更多细节: Sense不支持TextView.setCustomSelectionActionModeCallback(),因为Sense不使用ActionMode来提供文本选择功能(显然也不关心其他人是否会这样做!)所以这个问题在那种情况下有不同的味道(我还没有在Sense下测试以下解决方案,所以不确定它会如何表现)。

一种解决方案是创建您自己的自定义ActionMode.Callback来替换OS的,并将其应用于您想要的任何TextView和/或EditText的setCustomSelectionActionModeCallback()中(但仅当设备运行蜂窝或更高版本时)。将一个自定义onTextSelectionCABDestroyed回调接口传递给您的自定义ActionMode.Callback,在onDestroyActionMode方法中调用它。

首先,创建一个接口,并在您想要处理原始ActionMode的重新创建的地方实现它(或者,您可能想要使用一个带有类似Otto的总线事件):

代码语言:javascript
复制
public interface YourCallbackInterface {
    public void onTextSelectionCABDestroyed();
}

并创建一个新类:

代码语言:javascript
复制
public final class CustomTextSelectionActionModeCallback implements ActionMode.Callback {
WeakReference<YourCallbackinterface> mYourCallbackinterface;
public CustomTextSelectionActionModeCallback(YourCallbackinterface yourCallbackInterface) {
    mYourCallbackinterface = new WeakReference<YourCallbackinterface>(yourCallbackInterface);
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
    return false;
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
    return true;    //returning true will create the ActionMode
}
@Override
public void onDestroyActionMode(ActionMode mode) {
    //this is the magic where we actually capture the destroy event for TextSelectionCAB and can subsequently do things like recreate the ActionMore that TextSelectionCAB greedily destroyed!
    mYourCallbackinterface.get().onTextSelectionCABDestroyed();
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
    return false;
}

}

请记住,在从ActionMode的onDestroyActionMode重新创建ActionMode时,要避免使用StackOverflowException,将一个可运行的postDelayed添加到处理程序中,如下所示:Reopen ActionMode (or CAB) after onDestroyActionMode is called

最后,如果您正在使用ActionBarSherlock,请确保您的CustomTextSelectionActionModeCallback实现的是android.view.ActionMode.Callback而不是com.actionbarsherlock.view.ActionMode.Callback.

注意:我还没有使用过ActionBarCompat,所以不确定这一切如何应用到这里。如果有人知道,请发表评论!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16567783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档