9

这真的很奇怪。我第一次在 Eclipse 中启动应用程序并调用 startActionMode,一切正常。如果我关闭应用程序并再次打开它,则 startActionMode 返回 null。在我更改应用程序中的某些内容并从 Eclipse 再次运行它之前,它将始终返回 null。在文档中,它说如果 startActionMode 被取消,它会返回 null,但它没有解释为什么它被取消。

有任何想法吗?顺便说一句,我正在使用 actionbarsherlock

更新:如果我关闭手机或终止应用程序并再次启动应用程序,它可以工作......但是当我关闭它并再次打开它时会做同样的事情。

这是我的代码:ActionModeCallback 类:

   class ActionModeCallback implements ActionMode.Callback{

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

    @Override
    public void onDestroyActionMode(ActionMode mode) {

    }

    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {

    }

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        // TODO Auto-generated method stub

        return false;
    }
};

在我的主要活动中:

public ActionMode startActionMode()
{
    mActionMode = startActionMode(new ActionModeCallback());
    return mActionMode;
}

在我的列表视图适配器中:

 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

                MainActivity activity = (MainActivity)rowView.getContext();
                if (isChecked) {

                    if(actionmode == null){
                        actionmode = activity.startActionMode();
                    }else
                    {
                        actionmode.invalidate();
                    }
                }
                else {
                        activity.finishActionMode();
                        actionmode=null;
                }
            }
        });
4

4 回答 4

1

所以我终于找到了一个可能不是最好的解决方案的解决方法,但我没有找到任何其他解决方案。我在 onDestroy 中对我的活动进行了终止过程。

像这样 :

android.os.Process.killProcess(android.os.Process.myPid());

它现在正在工作。看来我的手机没有清除某些东西的记忆。

编辑:我无法使用此解决方案,因为即使应用程序关闭,我也需要打开一项服务。killProcess 也会杀死服务。

编辑 2 我终于找到了问题的根源。我保留了我的片段之一的静态变量。出于某种原因,即使重新启动应用程序,该变量也会保留在内存中。我仍然不知道为什么 startActionMode 返回 null。为了解决这个问题,我在我的活动的 onCreate 中实例化了我的变量。

于 2013-07-13T00:34:51.493 回答
1

好吧,我真的不明白为什么它会发生在你身上。但是我创建了一个 ListView,它与旧的 Gmail 的 ListView 具有相同的行为。

基本上,用户可以通过长按其中一个项目来启动“选择模式”,然后,用户可以通过长按或单击项目左侧来选择其他项目。该复选框由您的适配器管理,方法是使其在“选择模式”中可见,而在不处于“选择模式”时不可见。您还可以通过检查当前项目是否被选中来检查它。然后,将其设为不可点击,以便 ListView 可以获取触摸事件。

如果您希望 ListView 以“选择模式”启动,您可以将 selectableFromTheBeginning 设置为 true。然后,使 CheckBox 从一开始就可见。我会让它更容易使用并在以后记录它,但我认为它现在可以使用了。

这是 SelectionListView 的链接:

https://github.com/Cyber​​Eagle/OpenProjects/blob/master/android-projects/widgets/src/main/java/br/com/cybereagle/androidwidgets/view/SelectionListView.java

您还需要复制 attrs.xml 中指定要通过 XML 设置的 SelectionListView 属性的部分。

https://github.com/Cyber​​Eagle/OpenProjects/blob/master/android-projects/widgets/res/values/attrs.xml

要使用它,您需要实现 SelectionListView.SelecionActionModeCallback 而不是 ActionMode.ActionModeCallback。记得调用父母的方法。

您可以在 XML 中使用它并通过 ID 找到它。因此,您可以使用以下方法更改用户选择项目时出现的消息:

listView.setSelectedStringFormat("%d selected items");

您使用方法 setActionModeCallback 设置您的 SelectionListView.SelecionActionModeCallback 的实现。

在您的适配器中,您可以执行以下操作:

checkBox.setChecked(listView.isItemChecked(position));

在您的 ActionModeCallback 中,您可以实现如下内容:

public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
    SparseBooleanArray checkedItems = listView.getCheckedItemPositions();

    List<Item> selectedItems = new ArrayList<Item>();

    for (int i = 0; i < checkedItems.size(); i++) {
        if (checkedItems.valueAt(i)) {
            selectedItems.add(yourListOfItems.get(checkedItems.keyAt(i)));
        }
    }

    switch(item.getId()){
        case R.id.do_something:
            doSomething(selectedItems);
            mode.finish();
            break;
    }
}

您的复选框将如下所示:

<CheckBox
    android:id="@+id/select"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:clickable="false"
    android:focusable="false"
    android:focusableInTouchMode="false" />

使用此小部件,您无需过多担心 ActionMode 或选择项目的方式。我很抱歉缺少文档。这是我放一些代码在其他项目中使用的存储库。我打算把它记录下来。您可以查看其他小部件。

如果您使用它,请尊重 Apache 许可证。

于 2013-07-19T23:08:25.187 回答
0

startActionMode returns null if it was canceled

Stupid idea... but would it work if you set startActionMode to whatever it should be set at in the part of your app that handles what happens when you close the app?

于 2013-07-21T13:58:37.963 回答
0
 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    MainActivity activity = (MainActivity)rowView.getContext();
 }

这里rowView应该是buttonView。也许这导致了错误。

于 2014-07-25T16:19:09.523 回答