Java startActionMode返回null
真奇怪。第一次在eclipse中启动应用程序并调用startActionMode时,一切正常。如果我关闭应用程序并再次打开它,startActionMode将返回null。在我更改应用程序中的某些内容并从eclipse再次运行它之前,它将始终返回null。在文档中,它说如果startActionMode被取消,它将返回null,但它没有解释为什么它被取消 有什么想法吗?顺便说一句,我用的是actionbarsherlock 更新:如果我关闭手机或关闭应用程序并再次启动应用程序,它会正常工作。。。但当我关上它再打开它时,它也会做同样的事情 这是我的密码: ActionModeCallback类:Java startActionMode返回null,java,android,Java,Android,真奇怪。第一次在eclipse中启动应用程序并调用startActionMode时,一切正常。如果我关闭应用程序并再次打开它,startActionMode将返回null。在我更改应用程序中的某些内容并从eclipse再次运行它之前,它将始终返回null。在文档中,它说如果startActionMode被取消,它将返回null,但它没有解释为什么它被取消 有什么想法吗?顺便说一句,我用的是actionbarsherlock 更新:如果我关闭手机或关闭应用程序并再次启动应用程序,它会正常工作。。。
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;
}
}
});
因此,我最终找到了一个可能不是最佳解决方案的解决方案,但我没有找到任何其他解决方案。我在onDestroy中对我的活动执行了一个终止过程 像这样:
android.os.Process.killProcess(android.os.Process.myPid());
它现在正在工作。我的手机似乎没有清除一些记忆
编辑:我无法使用此解决方案,因为我有一项服务需要打开,即使应用程序已关闭。kill进程也会终止服务
编辑2
我终于找到了问题的根源。我保留了一个片段的静态变量。由于某些原因,即使在重新启动应用程序时,该变量仍保留在内存中。我仍然不知道startActionMode返回null的确切原因。为了解决这个问题,我在活动的onCreate中实例化了我的变量 我真的不明白为什么会发生在你身上。但是我已经创建了一个ListView,它的行为与以前Gmail的ListView相同 基本上,用户可以通过长按其中一个项目来启动“选择模式”,然后,用户可以通过长按或单击项目左侧来选择其他项目。该复选框由适配器管理,使其在“选择模式”下可见,在不在“选择模式”下不可见。还可以通过检查当前项目是否已选中来进行检查。然后,将其设置为不可单击,以便ListView可以获取触摸事件 如果希望列表视图以“选择模式”启动,可以将SelectablefromtheStart设置为true。然后,使复选框从一开始就可见。我将使它更易于使用,并在以后记录它,但我认为它现在是可用的 以下是SelectionListView的链接: 您还需要复制my attrs.xml中指定要通过xml设置的SelectionListView属性的部分 要使用它,可以实现SelectionListView.SelecionActionModeCallback而不是ActionMode.ActionModeCallback。记住调用父对象的方法 您可以在XML中使用它并按ID查找它。因此,您可以使用以下命令更改用户选择项目时显示的消息:
listView.setSelectedStringFormat("%d selected items");
您可以使用setActionModeCallback方法设置SelectionListView.SelectionActionModeCallback的实现
在适配器中,可以执行以下操作:
checkBox.setChecked(listView.isItemChecked(position));
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" />
在ActionModeCallback中,您可以实现如下内容:
checkBox.setChecked(listView.isItemChecked(position));
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" />
public boolean onActionItemClicked(ActionMode模式,菜单项){
SparseBooleanArray checkedItems=listView.getCheckedItemPositions();
List selectedItems=new ArrayList();
对于(int i=0;i
您的复选框如下所示:
checkBox.setChecked(listView.isItemChecked(position));
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许可证
如果startActionMode被取消,则返回null
愚蠢的想法。。。但是,如果你将startActionMode设置为应用程序中处理关闭应用程序时发生的事情的部分中应该设置的任何值,它会起作用吗
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
MainActivity activity = (MainActivity)rowView.getContext();
}
这里的
rowView
应该是buttonView
。可能是这导致了错误。您在活动中的什么地方调用startActionMode()?我是从listview适配器调用它的,请查看上面的代码:actionmode=activity.startActionMode();这是本机操作栏还是兼容操作栏(您是设备ICS还是更高版本?)。如果它是本机的,官方文档中的这一行可能适用于您-返回已启动的ContextMode,如果被取消,则返回null-
您误解了ActionBarSherlock有两种操作模式-兼容性,它重新实现ActionBar和本机的所有逻辑,它只是将其委托给框架的本机实现(如果可用)。您正在测试的设备的API级别是什么?您是否在这两种情况下都看到了这种行为?如果没有,您在哪里看到了这种行为?如果其他人有此问题,我的问题是我的主要活动中的每个片段都有不同的ActionMode.Callback。我所做的修复是不从包含ActionMode.Callback.looks的片段调用setRetainInstance()。看起来不错,我会给它一个tryOk。如果你有任何疑问,请问我。还有一件事:您可以通过ActionMode回调跟踪ActionMode是否显示。如果您发现一些bug或认为它应该有其他功能,请在此处创建一个问题:。我唯一的工作示例是我现在工作的公司,不幸的是,我无法发布源代码。这里的代码片段来自该公司的应用程序,但我无法显示完整的代码。如果你觉得有什么