我在应用程序中使用了一些自定义的ActionModes。当操作模式关闭时,我会做一些内务工作,比如关闭相关视图、更新更改等。我检测到OnDestroyActionMode中的操作模式已关闭。
我的问题是,在我的一些ActionModes中,用户可能会触发另一个系统操作模式(文本复制/粘贴/选择)。在这种情况下,onDestroyActionMode被调用,我错误地认为用户已经完成了第一个操作模式,而不是实现“堆栈”功能,所以我可以忽略这个onDestroyActionMode,让用户编辑/剪切/等等文本,然后在完成后重新打开前一个操作模式。
我如何才能做到这一点?
发布于 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的总线事件):
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添加到处理程序中,如下所示:Reopen ActionMode (or CAB) after onDestroyActionMode is called
最后,如果您正在使用ActionBarSherlock,请确保您的CustomTextSelectionActionModeCallback实现的是android.view.ActionMode.Callback而不是com.actionbarsherlock.view.ActionMode.Callback.
注意:我还没有使用过ActionBarCompat,所以不确定这一切如何应用到这里。如果有人知道,请发表评论!
https://stackoverflow.com/questions/16567783
复制相似问题