按下返回button,取消操作模式

操作模式通过调用getActivity().startActionMode(calback);启动getActivity().startActionMode(calback); 在按下后退button后自动取消。 有可能避免这种行为? 在操作模式中,在某些情况下,按下后退button后,我需要再次执行另一个操作。

Solutions Collecting From Web of "按下返回button,取消操作模式"

这是一个有趣的问题。 当ActionMode处于活动状态时,后退键事件在内部消耗。 该事件不会传播到onBackPressed()onKeyUp(int keyCode, KeyEvent event)callback。

幸运的是,您可以使用仍然被调用的dispatchKeyEvent(KeyEvent event)

 @Override public boolean dispatchKeyEvent(KeyEvent event) { if(mActionModeIsActive) { if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) { // handle your back button code here return true; // consumes the back key event - ActionMode is not finished } } return super.dispatchKeyEvent(event); } 

您可能想知道如果在ActionMode中有一个子菜单,并且用后退键closures它,那么行为将会是什么。 在这种情况下dispatchKeyEvent()不被调用,所以你可以安全地使用代码。

上面的代码也适用于ActionBarSherlock。 我发现唯一的问题是在使用本机ActionMode的Android 3.1设备上,在这种情况下dispatchKeyEvent()没有被调用。 使用ActionBarSherlock的ActionMode来解决它。

build议的解决scheme不适合我。 所以我决定手动创buildback事件。 我需要这个事件在我的片段,所以我创build了BaseFragment ,我所有的片段将扩展。

 public abstract class BaseFragment extends Fragment { private ActionModeState actionModeState = ActionModeState.ITEM_NOT_CLICKED; protected enum ActionModeState { ITEM_NOT_CLICKED, ITEM_CLICKED } protected void onActionItemClicked() { actionModeState = ActionModeState.ITEM_CLICKED; } protected void onDestroyActionMode() { if (actionModeState == ActionModeState.ITEM_NOT_CLICKED) { onActionModeBackPressed(); } else { // reset state actionModeState = ActionModeState.ITEM_NOT_CLICKED; } } protected void onActionModeBackPressed() { } } 

主要片段

 public class YourMainFragment extends BaseMapFragment { @Override public void onActionModeBackPressed() { // you code for action mode back button } private ActionMode.Callback actionModeCallback = new ActionMode.Callback() { @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { YourMainFragment.this.onActionItemClicked(); .... } @Override public void onDestroyActionMode(ActionMode mode) { YourMainFragment.this.onDestroyActionMode(); ... } }; 

在传递给AppCompatDelegateImplBase之前,创build自己的Window.Callback和intercept事件。

 @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { //default delegate final Window window = getActivity().getWindow(); mWindowCallbackDelegate = new WindowCallbackDelegate(window.getCallback(), this); window.setCallback(mWindowCallbackDelegate); return true; } 

在你自己的代表中:

 @Override public boolean dispatchKeyEvent(KeyEvent event) { return myWindowDelegate.dispatchKeyEvent(event) || mOriginalWindowCallback.dispatchKeyEvent(event); } 

当你销毁行动模式,恢复对前一个委托的引用

  @Override public void onDestroyActionMode(ActionMode mode) { Window.Callback originalWindowCallback = mWindowCallbackDelegate.getOriginalWindowCallback(); if (originalWindowCallback != null) { getActivity().getWindow().setCallback(originalWindowCallback); }} 

您拥有代表签名:

public class WindowCallbackDelegate implements Window.Callback {...}