0

我正在以编程方式使用 TextViews 填充 LinearLayout,在其中放置基于从数据库和用户首选项填充的实体的文本。

我现在正在尝试在每个 TextViews 上添加一个上下文菜单,以允许用户删除该特定条目(因此是对象,因此是 db 行)。

我可以长按打开上下文菜单,但我看不到获取与菜单关联的 TextView 的 id 的方法。

几乎所有关于此的信息都引用了 ListViews(我没有使用 - 在 ScrollView 中有一个 ListView 存在问题),并且很多引用了 Adapters(我没有使用,数据需要在之前彻底按摩体面的)。

LinearLayout 在 XML 中指定。我在进行数据库查找的 AsyncTask 的 onPostExecute 中将 TextViews 添加到它。

我尝试以两种方式注册上下文菜单:使用 Activity.registerForContextMenu(TextView) 和 textView.setOnCreateOptionsMenuListener(new ...)。

问题出在以下部分:

@Override
public boolean onContextItemSelected(MenuItem item) {
    ContextMenuInfo info = (ContextMenuInfo) item.getMenuInfo();
    switch (item.getItemId()) {
        case R.id.delete_entry:
              // how do I get the TextView id here???
            return true;
        default:
            return super.onContextItemSelected(item);
    }
}

ContextMenuInfo 变量为空,没有任何帮助。

4

1 回答 1

0

这个问题的一个答案来自阅读get view id from oncontextitemselected

虽然它有点hacky,但它确实有效,而且现在很好。

您确实在 onCreateContextMenu 方法中将 View 变量作为参数。然后将该变量存储在具有类范围的其他变量中,您将能够在 onContextItemSelected 方法中使用这些变量是微不足道的。

例子:

private TextView contextTextView = null;

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.tankbeurt_wissen, menu);
    contextTextView = (TextView) v;
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.delete_entry:
                System.out.println(contextTextView.getId()+" called this method");
            return true;
        default:
            return super.onContextItemSelected(item);
    }
}

希望这对某人有帮助,就像对我有帮助一样。

于 2013-02-16T19:29:03.850 回答