真的很奇怪。第一次在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;
}
};
在我的主要 Activity 中:
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;
}
}
});
最佳答案
好吧,我不太了解为什么会发生在您身上。但是我创建了一个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。记住要调用 parent 的方法。
您可以在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许可证。