检测ActionMode嵌套

时间:2013-05-15 14:27:34

标签: android nested ondestroy actionmode

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

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

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

进一步说明你的情况:在蜂窝之前,longPress在TextView上将产生一个弹出窗口,其中包含选项(如“选择单词”,“全选”和“添加”某些字“到字典”),同时不影响任何现有的ActionMode都在显示时和被解雇时(通过按下)。所以这不是蜂窝前的问题。

关于HTC Sense的更多亮点:Sense不支持TextView.setCustomSelectionActionModeCallback(),因为Sense没有将ActionMode用于文本选择功能(显然不关心世界其他地方的做法!)。所以这个问题在这种情况下有不同的气味(我没有在Sense下测试以下解决方案,所以不确定它会如何表现)。

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

首先创建一个接口并在你想要处理原始ActionMode的重新创建的地方实现它(或者你可能想要使用像Otto这样的总线事件):

public interface YourCallbackInterface {
    public void onTextSelectionCABDestroyed();
}

并创建一个新类:

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 Runnable到Handler,我在这里解释:Reopen ActionMode (or CAB) after onDestroyActionMode is called

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

注意:我没有使用ActionBarCompat,因此不确定这一切是如何应用的。如果有人知道,请发表评论!