startActionMode返回null

时间:2013-07-12 22:37:51

标签: java android

真的很奇怪。我第一次在eclipse中启动应用程序并调用startActionMode,一切正常。如果我关闭应用程序并再次打开它,startActionMode将返回null。它将始终返回null,直到我在应用程序中更改某些内容并从eclipse再次运行它。在文档中,它说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;
}

在我的listview适配器中:

 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 个答案:

答案 0 :(得分:1)

所以我终于找到了一个可能不是最佳解决方案的解决方法,但我没有找到任何其他解决方案。我在活动的onDestroy上做了一个杀戮过程。

像这样:

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

现在正在运作。看来我的手机并没有清除某些东西。

编辑:我无法使用此解决方案,因为即使应用已关闭,我也有需要打开的服务。 killProcess也会终止服务。

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

答案 1 :(得分:1)

好吧,我真的不明白为什么会发生这种情况。但是我已经创建了一个ListView,它具有与旧版Gmail ListView相同的行为。

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

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

这是SelectionListView的链接:

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

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

https://github.com/CyberEagle/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许可证。

答案 2 :(得分:0)

  

startActionMode如果被取消则返回null

愚蠢的想法......但如果你将startActionMode设置为应用程序中应该设置的任何内容来处理你关闭应用程序时会发生什么,它会起作用吗?

答案 3 :(得分:0)

 public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    MainActivity activity = (MainActivity)rowView.getContext();
 }

此处rowView应该是buttonView。也许这会导致错误。