Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何识别是否在ActionMode中单击了“完成”按钮_Android_Android Actionbar_Actionbarsherlock - Fatal编程技术网

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

Android 如何识别是否在ActionMode中单击了“完成”按钮,android,android-actionbar,actionbarsherlock,Android,Android Actionbar,Actionbarsherlock,我使用ActionMode选择网格中的项目。问题是我无法识别是否单击了Done按钮。我唯一能做的就是知道ActionMode已经完成。但按后退也会完成操作模式。 所需的行为是在完成时接受选择单击,然后在返回时退出操作模式 我尝试使用ActionMode.setCustomView()但它不影响Done按钮。启动ActionMode时不会调用活动.onBackPressed() 我找到的一个解决方案是使用ActionBarSherlock并手动完成按钮: View closeButton = fi

我使用
ActionMode
选择网格中的项目。问题是我无法识别是否单击了Done按钮。我唯一能做的就是知道
ActionMode
已经完成。但按后退也会完成
操作模式
。 所需的行为是在完成时接受选择单击,然后在返回时退出
操作模式

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

我找到的一个解决方案是使用ActionBarSherlock并手动完成按钮:

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

但它只能在Android 2.x-3.x上工作,因为在4.x上使用了本机操作栏。

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

当动作模式被解除时,您可以使用
onDestroyActionMode
回调。

以下是解决方案:

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();
    }
});

这是我的实现,这是一个适当的黑客,但它工作,我真的找不到一个替代做一些具体的事情时,点击ActionMode完成。我觉得很奇怪,你不能更优雅地捕捉这个事件

任何建议,使这稍微不难看将不胜感激

在我的活动中

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.
}
如果您在活动中使用片段,那么这些代码中的一些可能需要在片段中,而其他位则需要在活动中


@杰克·沃顿(和其他ActionBarSherlock用户)如果你在旅行中看到这一点。我很想知道上述内容是否与ABS兼容,因为我还没有将ABS与当前项目集成。

我明白了,但我正在实现一个支持多重选择的选择器,我认为“完成”按钮是接受选择的最佳方式。。。无论如何,谢谢你的回答!似乎我必须添加一个菜单项来接受所选项目。但是我们如何区分“完成”按钮和“返回”按钮呢?我需要为这些实现不同的操作…您可能能够在按下按钮时截获
onBackPressed
。否则,你不能。@JakeWharton如何区分由于屏幕旋转或“完成”按钮导致的操作模式破坏。实际上,我有一个ID列表要添加到fav数据库表中,所以如果设备方向改变,我应该保留这个数组,如果用户单击“完成”按钮,我应该清除它,请help@JakeWharton但是这个场景怎么样:我有一个片段,其中有一个列表视图,该片段在一个ViewPager中。轻触并按住可启动驾驶室,按“完成”可取消驾驶室。说我在多选择的中间(所以出租车在开)。当我在ViewPager中滑动到另一个片段时,我自然希望移除CAB,因此要执行此操作,我在第一个片段的onPause方法上完成actionmode,当用户滑动回该片段时,我再次启动CAB。我想我应该能够区分通过滑动和通过完成解除CAB,这样我就可以在暂停时重新启动CAB。这确实有效,但我在项目中的一些地方使用了动作模式。因此,我决定将菜单项添加到操作模式中,并将其用作实际的“确认”项。我将主图标转换为一个解散图标。这使代码的黑客性大大降低。它看起来还可以检测正常菜单项的单击时间,而不仅仅是按下“完成”按钮的时间。@JDJ你怎么会这么认为?至于答案,看起来不错,但它在没有MactionMode的情况下也可以工作:相反,只需确保在onCreateActionMode中设置
mbackwassedInActionMode=false
,然后在
dispatchKeyEvent
中删除
&
,所以这只是第二次测试。只是一个旁注:注意,您在活动中调用
findViewById
当您启动操作模式而不是从其他视图启动时,或者您将得到一个
空指针异常
。这不适用于Gingerbread等预ICS设备上的ABS。此代码仅适用于API级别>=11,您需要添加API级别条件:view doneButton;如果(android.os.Build.VERSION.SDK_INT>=11){doneButton=Resources.getSystem().getIdentifier(“操作模式关闭按钮”、“id”、“android”);}或者{doneButton=findViewById(R.id.abs_uu操作模式关闭按钮)}警告:这是一个不灵活的解决方案,它本质上是在访问私有API。如果谷歌改变了“动作\模式\关闭\按钮”的名称,这将停止工作。除了方向改变按钮松开它的点击监听器外,这个解决方案工作得很好。我不是在破坏关于方向改变的活动。