我使用ActionMode
选择网格中的项目。问题是我无法识别是否单击了完成按钮。我唯一能做的就是知道ActionMode
已经完成了。但按返回也会完成ActionMode
。
所需的行为是接受完成点击的选择,然后在返回上退出ActionMode
。
我尝试使用ActionMode.setCustomView()
,但不会影响完成按钮。启动ActionMode时不会调用Activity.onBackPressed()
。
我发现的一个解决方案是使用ActionBarSherlock并手动获取完成按钮:
View closeButton = findViewById(R.id.abs__action_mode_close_button);
但它仅适用于Android 2.x-3.x,因为在4.x上使用了原生操作栏。
答案 0 :(得分:36)
请不要这样做,因为它是特定于实现的,非常不标准。
您可以在解除操作模式时使用onDestroyActionMode
回调。
答案 1 :(得分:21)
以下是解决方案:
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();
}
});
答案 2 :(得分:10)
这是我的实现,它是一个正确的黑客,但它的工作原理,当单击ActionMode DONE时,我无法真正找到做某些特定内容的替代方法。我发现你不能更优雅地捕捉这个事件真的很奇怪。
任何建议使这个稍微不那么难看将非常感谢...
在我的活动中..
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.
}
如果你在Activity中使用Fragments,那么这些代码中的一部分可能需要在Fragment中,以及Activity中的其他位。
@JakeWharton(和其他ActionBarSherlock用户),如果你在旅行中看到这个。我有兴趣知道上面是否与ABS兼容,因为我还没有将ABS与我当前的项目集成。