防止按返回键取消操作模式(Prevent to cancel Action Mode by pres

2019-06-26 14:49发布

操作模式通过调用启动getActivity().startActionMode(calback); 回来后按下按钮被自动取消。 有可能避免这种情况? 我需要做的另一个操作后退按钮是在操作模式在某些情况下压后。

Answer 1:

这是一个有趣的问题。 当ActionMode是活动的返回键事件在国内消费。 该事件不会传播到任何onBackPressed()onKeyUp(int keyCode, KeyEvent event)的回调。

幸运的是,你可以使用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子菜单的行为和你返回键关闭它。 在这种情况下dispatchKeyEvent()不被调用,所以你可以放心地使用代码。

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



Answer 2:

建议的解决方法并没有为我工作。 所以,我决定创建back手动事件。 我需要在我的片段这个事件所以我创建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();
            ...
        }
    };


Answer 3:

它被传递给AppCompatDelegateImplBase之前创建自己的Window.Callback和拦截事件。

@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 {...}



文章来源: Prevent to cancel Action Mode by press back button