如何识别在ActionMode中是否单击完成button

我使用ActionMode来select网格中的项目。 问题是,我无法识别是否完全按下了完成button。 我唯一可以知道的是ActionMode已经完成了。 但是按下Back也完成了ActionMode 。 期望的行为是在完成单击时接受select,并在Back按下退出ActionMode

我试图使用ActionMode.setCustomView()但它不影响完成button。 当ActionMode启动时, Activity.onBackPressed()不会被调用。

我发现的一个解决scheme是使用ActionBarSherlock并手动获取完成button:

 View closeButton = findViewById(R.id.abs__action_mode_close_button); 

但是它仅适用于Android 2.x-3.x,因为在4.xa本机操作栏上使用。

请不要这样做,因为它是特定于实现的,而且非常不规范。

您可以使用onDestroyActionModecallback来解除操作模式。

这是解决scheme:

 ActionMode mMode = MyActivityClass.this.startActionMode(some implementation); int doneButtonId = Resources.getSystem().getIdentifier("action_mode_close_button", "id", "android"); View doneButton = MyActivityClass.this.findViewById(doneButtonId); doneButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // do whatever you want // in android source code it's calling mMode.finish(); } }); 

这里是我的实现,这是一个适当的黑客攻击,但它的工作原理,我真的找不到一个替代scheme,当点击ActionMode DONE时做特定的事情。 我觉得很奇怪,你不能更优雅地捕捉这个事件。

任何build议,使这个稍微不丑陋的将不胜感激…

在我的活动..

 boolean mActionModeIsActive = false; boolean mBackWasPressedInActionMode = false; @Override public boolean dispatchKeyEvent(KeyEvent event) { mBackWasPressedInActionMode = mActionModeIsActive && event.getKeyCode() == KeyEvent.KEYCODE_BACK; return super.dispatchKeyEvent(event); } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { mActionModeIsActive = true; return true; } @Override public void onDestroyActionMode(ActionMode mode) { mActionModeIsActive = false; if (!mBackWasPressedInActionMode) onActionModeDoneClick(); mBackWasPressedInActionMode = false; } public void onActionModeDoneClick(); { // Do something here. } 

如果您的活动使用Fragments,那么这些代码中的一部分可能需要放在Fragment中,而Activity中的其他位则可能需要。

@JakeWharton(和其他ActionBarSherlock用户),如果你在旅行中看到这个。 我有兴趣知道上述是否与ABS兼容,因为我还没有将ABS与我目前的项目整合。