【问题标题】:onCreateContextMenu is invoked with a null value for ContextMenuInfo使用 ContextMenuInfo 的空值调用 onCreateContextMenu
【发布时间】:2022-01-29 01:15:13
【问题描述】:

我正在尝试使用 ContextMenu。我已经使用 SimpleCursorAdapter 为一个简单的 ListActivity 成功完成了这项工作。

继续我想用 CursorAdapter 替换 SimpleCursorAdapter 但仍保留 ContextMenu 行为,所以我添加了两个强制覆盖函数 bindView 和 newView

public View newView(Context context, Cursor cursor, ViewGroup parent) {
    View view = mLayoutInflater.inflate(R.layout.check_row, parent, false);
    registerForContextMenu(view);
    return view;
}

注意 registerForContextMenu 替换了 ListActivity 的 onCreate 方法中的 registerForContextMenu(getListView())。我发现有必要调用 onCreateContextMenu(...)

除了提供给 onCreateContextMenu(...) 的 ContextMenuInfo 参数之外,所有这些都有效(使用预期的小部件创建的行、它们工作的回调等)现在为空 - 阻止我访问 rowId。

还有其他技巧可以执行吗?可能是在 CursorAdapter 的 bindView(...) 方法中?

【问题讨论】:

    标签: android listview android-cursor


    【解决方案1】:

    我正在回答这个问题 - 但我要指出,“commonsware.com”提供了线索和方向,见上文。

    问题

    • 在行布局中使用 CheckBox 会影响上下文菜单的使用
    • 我相信,CheckedTextView 用于多选,它不适合初始化选中状态。

    我采用的解决方案如下

    1. 使用 CheckedTextView
    2. 从 CursorAdapter 扩展以在 bindView(...) 期间初始化检查状态
      注意:这也必须管理显示正确的图标
    3. 在onListItemClick(...)中管理CheckedTextView的状态并记录在dBase中,不要忘记更新光标。

    【讨论】:

      【解决方案2】:

      这不是正确的方法。您为ListView 注册上下文菜单,而不是行。预先调用registerForContextMenu(),也许在你扩展布局之后调用onCreate()

      【讨论】:

      • 我想将 registerForContextMenu() 放在 onCreate() 中,但这样做会导致列表条目对长按没有响应 - 所以没有调用 onCreateContextMenu() ,因此没有上下文菜单。放置寄存器 newView() 会导致对 onCreateContextMenu() 的回调 - 但现在 ContextMenuInfo 参数为空。但是 - 在 newView() 和 onCreate() 中都有注册,因为 onCreateContextMenu() 是通过 ContextMenuInfo 中的有效条目调用的。我不相信这是“正确的”,一定有更好的方法吗?
      • “我想将 registerForContextMenu() 放在 onCreate() 中,但这样做会导致列表条目不响应长按 - 所以没有调用 onCreateContextMenu(),因此没有上下文菜单。”查看 github.com/commonsguy/cw-android/tree/master/Database/Constants 以获取 ListView 和 registerForContextMenu() 的示例。
      • 谢谢。我拿了这个样本并尝试在这里而不是在我自己的代码中重新创建我的问题 - 啊哈!修改 row.xml 以使 CheckBox 和 ContextMenus 不再可用。您不需要任何逻辑来处理 CheckBox,只需在 row.xml
      • 您可以尝试改用 CheckedTextView,这是官方支持的在 ListView 行中放置复选框的方式。给它@android:id/text1 的 android:id,Android 甚至应该通过 CHOICE_MODE_SINGLE 处理它。
      • 好调用 - 这更简单,并且允许上下文菜单“开箱即用”。但是,它确实存在从 dB 光标设置初始检查状态的问题(我还没有解决)
      猜你喜欢
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-23
      相关资源
      最近更新 更多