- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果您直接调用 AbsListView.setItemChecked()
,效果很好,ActionMode
将激活并创建。
mGridView.setItemChecked(pPosition, true);
但是当你先调用View.startActionMode()
,再调用AbsListView.setItemChecked()
时,创建的
将销毁,并通过 ActionMode
startActionMode()setItemChecked()
重新创建一个新的。
我的问题是:如何在调用 View.startActionMode()
时避免这个问题?
期待您的回复!谢谢!
最佳答案
为什么要重新创建一个新的?查看AbsListView.setItemChecked(int position, boolean value)
方法的源码,可以看到如下代码:
// Start selection mode if needed. We don't need to if we're unchecking something.
if (value && mChoiceMode == CHOICE_MODE_MULTIPLE_MODAL && mChoiceActionMode == null) {
if (mMultiChoiceModeCallback == null ||
!mMultiChoiceModeCallback.hasWrappedCallback()) {
throw new IllegalStateException("AbsListView: attempted to start selection mode " +
"for CHOICE_MODE_MULTIPLE_MODAL but no choice mode callback was " +
"supplied. Call setMultiChoiceModeListener to set a callback.");
}
mChoiceActionMode = startActionMode(mMultiChoiceModeCallback);
}
这意味着如果 mChoiceActionMode == null
,它将调用 startActionMode(mMultiChoiceModeCallback)
,因此将重新创建一个新的 ActionMode。
如何修复?这里有一个简单的方法:使用reflect将startActionMode()
创建的ActionMode赋值给AbsListView
中的私有(private)字段mChoiceActionMode
。
private void startActionMode() {
// Get the field "mMultiChoiceModeCallback" instance by reflect
AbsListView.MultiChoiceModeListener wrapperIns = null;
try {
Field wrapper = null;
wrapper = AbsListView.class.getDeclaredField("mMultiChoiceModeCallback");
wrapper.setAccessible(true);
wrapperIns = (AbsListView.MultiChoiceModeListener) wrapper.get(mMessageGridView);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
// Start the ActionMode, but not select any item.
ActionMode actionMode = mMessageGridView.startActionMode(wrapperIns);
// Assign actionMode to field "mChoiceActionMode" by reflect
try {
Field mChoiceActionMode = null;
mChoiceActionMode = AbsListView.class.getDeclaredField("mChoiceActionMode");
mChoiceActionMode.setAccessible(true);
mChoiceActionMode.set(mMessageGridView, actionMode);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
为什么我们在这里使用包装器?因为 AbsListView.setMultiChoiceModeListener(MultiChoiceModeListener listener)
会把我们的 mMultiChoiceModeListener 包裹起来,所以我们不能不直接使用。
关于Android:AbsListView.setItemChecked() 导致 ActionMode 销毁并重新创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28756478/
我想在 ActionMode 中添加一个下拉菜单,它看起来像 Android 官方 Gallery 应用程序中的下拉菜单,它允许您“选择所有”或“取消选择所有”图像。如下图所示: 我发现的唯一方法是通
我有一个列表 Activity ,用户可以在其中执行打开操作模式 A和 B .用户还可以打开操作模式 A然后B在它上面。 问题是当 Action 模式A显示并且操作模式 B 显示在其顶部,A当 B 时
我正在学习教程 11. Exercise: Using the contextual action mode 但是我有这个错误: mActionMode = Display.this.startAct
我正在使用“AppCompact”并实现“ActionMode.Callback”,我看到了 2 个具有相同覆盖方法的不同“ActionMode”。 “android.view.ActionMode”
我使用 startSupportActionMode(...) 在我的应用中启动 acion 模式。但是当我点击智能手机上的后退按钮时,操作模式被取消。 我发现了这个解决方案,但它对我不起作用。第二个
我在 ListView 中使用操作模式进行多选。我遇到的问题是,在模拟器上测试时,我指定为隐藏在我的操作模式菜单中的图标永远不会隐藏在溢出菜单中,尽管在预览中它是。我在这里使用 AppCompat 主
目前,操作模式工具栏显示在工具栏上方,将整个布局向下移动,我希望它显示在我当前工具栏的顶部。我尝试了 this post 中的所有解决方案和 this one : 我尝试使用带或不带 android:
在我的 Activity 中,我使用带有微调器而不是标题(在 xml 中定义)的 Toolbar(来自 appcompat)。该 Activity 不是 ActionBarActivity,因此我不将
我正在使用新的 android 支持库 21.0.2,当我调用 ActionMode 进行文本选择时,我得到了这个。 似乎标题 TextView 背景是透明的。 重新定义 ActionMode 的 t
我有启动 Action 模式的列表 fragment 。我正在使用 actionbarsherlock。但是当方向改变时,或者当我开始新的 Activity 时,上下文操作栏就会消失。有什么方法可以恢
我们如何更改 ActionMode 的布局或背景?有方法actionMode.getCustomView();但总是返回 null 。有什么建议吗? 最佳答案 您可以通过带有此属性的 styles.x
哎呀。当我将我的应用程序升级到 L 时,我用工具栏替换了 ActionBars,现在每当我启动 ActionMode 时,它都会下推所有内容。 (我想这是因为再次显示 ActionBar 是为了显
除了传统的 android 之外,我正在尝试将 android.view.ActionMode 与新的 android.support.v7.widget.Toolbar 一起使用.app.Actio
我为 ActionMode 编写了一个自定义菜单,并将其作为文本选择中的自定义 ActionMode 传递给 TextView.setCustomSelectionActionModeCallback
我正在使用 Android 的新小部件 Toolbar,我想更改它的 ActionMode 的背景和文本颜色(第一个奇怪的事情:ActionMode 不会使用默认的原色,它应该是默认行为...)。 我
我有一个 ActionMode 的实现来显示多个在 RecyclerView 中选择项目。 我想知道什么时候点击 actionMode 中的后退按钮以相应地重置 recyclerView 但是在实现
几天来我一直在尝试寻找 ActionMode 内存泄漏的根源,但没有成功。我有一个包含多个 fragment 的 Activity ,当我离开具有 ActionMode 的 fragment (同时自
有没有办法在不更改“正常”ActionBar 图标的情况下更改 ActionMode 溢出图标? 最佳答案 I still need to figure out how to only change
我有以下 Activity 布局:
我有一项新支持工具栏和抽屉导航的 Activity 。工具栏与内容相关,例如元素 list 。可以选择多个项目 - 然后显示 ActionMode(上下文操作栏)。然而系统的ActionMode位置、
我是一名优秀的程序员,十分优秀!