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

Tan*_*nya 35 android actionbarsherlock android-actionbar

ActionMode用来选择网格中的项目.问题是我无法识别是否单击了完成按钮.我唯一能做的就是知道ActionMode已经完成了.但是按下Back也完成了ActionMode.期望的行为是接受选择完成点击,并退出ActionMode机.

我尝试使用,ActionMode.setCustomView()但它不会影响完成按钮.在Activity.onBackPressed()启动ActionMode时,不叫.

我发现的一个解决方案是使用ActionBarSherlock并手动获取Done按钮:

View closeButton = findViewById(R.id.abs__action_mode_close_button); 
Run Code Online (Sandbox Code Playgroud)

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

Jak*_*ton 36

请不要这样做,因为它是特定于实现的,非常不标准.

您可以在onDestroyActionMode解除操作模式时使用回调.

  • 但是我们如何区分完成按钮和后退按钮?我需要为那些人实施不同的行动...... (9认同)

Ale*_*dev 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();
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 只是旁注:注意你从开始动作模式的活动而不是从其他视图调用`findViewById`,否则你会得到一个'空指针异常'. (4认同)
  • 警告:这是一个不灵活的解决方案,它实际上是访问私有API.如果Google更改了action_mode_close_button的名称,则此功能将停止运行. (3认同)

Eur*_*nes 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.
}
Run Code Online (Sandbox Code Playgroud)

如果您在Activity中使用Fragments,那么这些代码中的一些可能需要在Fragment中,以及Activity中的其他位.

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