如何识别是否在ActionMode中单击了“完成”按钮

时间:2012-07-25 04:44:13

标签: android android-actionbar actionbarsherlock

我使用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上使用了原生操作栏。

3 个答案:

答案 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与我当前的项目集成。