操作模式通过调用启动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