安卓兼容性上下文操作栏

25

在尝试遵循Android设计指南时,我遇到了一个小问题。

我想要有一个项目列表,可以长按其中几个(多选),然后对它们执行批量操作。

设计指南建议使用上下文操作栏来实现这一点,它听起来就像我所想的那样完美。但问题是,我正在尝试向后兼容API 7(因为我的手机当前运行的是2.3.3)。

我正在使用ActionBarSherlock获取其他操作栏内容,但我似乎无法弄清楚如何启动上下文操作栏,也没有找到如何在ABS中任意添加按钮的方法。我看到你可以做选项卡,所以可能那就是答案,但由于我想允许多选,我不想有普通的模态上下文菜单。


嗨,你有看过示例源代码吗?其中还包括添加按钮、上下文按钮等示例。https://github.com/JakeWharton/ActionBarSherlock/tree/master/samples/demos - burak altundal
2
是的,我查看了那个文件夹中的类,但我没有看到你所说的例子。我只看到在OptionsMenu创建步骤中添加内容的示例,但我想要在长按某个项目后(逻辑上是一种上下文操作)进行添加。你能具体告诉我在哪个文件中看到这个吗? - Paul
这就是我使其工作的方式 https://dev59.com/EmUq5IYBdhLWcg3wKtRL#14737520 - Yaroslav Mytkalyk
6个回答

22

这个回答可能有些晚了,但我认为它可以帮助那些遇到困难的人。

打开上下文操作栏其实很简单,在你的活动的任何时刻,你只需要调用以下代码:

startActionMode(mActionModeCallback);

如果你不在主活动中,比如在片段中,你可以使用以下代码获取对应的引用:

getSherlockActivity().startActionMode(mActionModeCallback);

这是回调函数。

private ActionMode.Callback mActionModeCallback = new ActionMode.Callback(){

    @Override 
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
          MenuInflater inflater = mode.getMenuInflater();
          inflater.inflate(R.menu.actionbar_context_menu, menu);
          return true;
        }

    @Override
    public void onDestroyActionMode(ActionMode mode) {

    }

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        switch (item.getItemId()) {
            case R.id.menu_item1:
                return true;
            case R.id.menu_item2:
                //close the action mode
                //mode.finish();
                return true;
            default:
                mode.finish();
                return false;
       }
    }
};

这个xml文件是一个简单的菜单,类似于ActionBar的菜单:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

<item android:id="@+id/menu_item1"
      android:icon="@drawable/ic_item1"
      android:title="@string/ITEM1"
      android:showAsAction="always|withText" />

<item android:id="@+id/menu_item2"
      android:icon="@drawable/ic_item2"
      android:title="@string/ITEM2"
      android:showAsAction="always|withText" />


2
哇,好棒的答案!我为此苦苦挣扎了几个小时!做得好! - Francois

16

设置上下文操作栏与设置“普通”操作栏项在XML方面是相同的。 开发人员指南中的这个示例解释了一切

要使用ActionBarSherlock,请将默认的Android回调替换为ActionBarSherlock编辑的回调(例如,使用com.actionbarsherlock.view.ActionMode而不是Android.View.ActionMode)。


1
据我所知,该命名空间不存在。 - Paul
2
你正在使用ActionBarSherlock的v4.0版本吗?它在上周退出了beta版。 - Reinier
升级到4.0版本将会添加你所缺失的命名空间。 - Reinier

2

ActionBarSherlock有自己的ActionMode实现,但是您需要手动控制其生命周期。我写了一个关于此的教程:教程链接


1

关于长按示例,请参考以下链接。第一个链接是示例所需的Java代码。第二个链接是如何定义布局的说明;


1
那与我的问题无关。那个例子是如何从片段中显示上下文菜单的。我正在尝试复制更高级API中的上下文操作栏。 - Paul

0
我来回答你问题的第二部分。下面是一个示例,演示如何使用ActionBarSherlock库将任何视图实例(在下面的代码中为按钮)添加到操作栏中:
@Override
public boolean onCreateOptionsMenu(Menu menu) {

        refreshButton = (RotatingButton) LayoutInflater.from(this).inflate(R.layout.actionbar_customview_refresh, null);
        refreshButton.setOnClickListener(refreshButtonListener);

        MenuItem item = menu.add(0, android.R.id.copy, 0, getString(R.string.actionbar_refresh));
        item.setActionView(refreshButton);
        item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);

        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main_activity_action_bar, menu);
}

是的,我以前做过这件事,但那会让它在该活动的操作栏中一直显示。我想要做的是只在列表中选择了项目后才显示按钮,并在每次选择项目后进行更新。 - Paul

0

我曾经遇到过同样的问题。当我找到this link时,问题得以解决。基本上,您需要创建一个实现ActionMode.Callback的回调类。在这个类中,您可以使用您的上下文操作栏来填充操作栏。在每次选择(或长按)时,您都可以使用startActionMode方法启动回调。请参见链接以获取可工作的代码=]

编辑:在Sherlock的示例中也有一个示例,位于/samples/demos/src/com/actionbarsherlock/sample/demos/ActionModes.java


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接