37

ActionMode用来选择网格中的项目。问题是我无法识别是否完全单击了“完成”按钮。我唯一能知道的就是ActionMode已经完成了。但是按Back也完成了ActionMode所需的行为是在完成单击时接受选择,并ActionMode按时退出。

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

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

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

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

4

3 回答 3

39

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

您可以在onDestroyActionMode关闭操作模式时使用回调。

于 2012-07-25T06:14:11.413 回答
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();
    }
});
于 2012-12-30T12:32:48.183 回答
11

这是我的实现,它是一个适当的 hack,但它有效,当单击 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 与我当前的项目集成。

于 2013-03-28T20:57:13.197 回答