0

我有一个 TableLayout,它根据光标的大小动态添加 TableRows。在每一行中,我添加了一个删除按钮,该按钮设置为不可见。每行和按钮在创建时都会获得一个相同的 id,如果然后属于同一行。当用户 LongClicks 上的 TableRow 时,可见性设置为Visible改为并出现删除按钮。

OnLongClick侦听器中,我检查按钮 ID 是否与单击的视图(此处为 TableRow)相同。

        rel.addView(btnDelete);
            tr.addView(rel);


        tr.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View view) {
                    int tableRowId = view.getId();
                 if(tableRowId == btnDelete.getId()){
                    btnDelete.setVisibility(View.INVISIBLE);
                    }
                    return true;
                }
            });

但它似乎只适用于底部最低按钮上的按钮。因此,似乎btnId存储为最后btnId添加的,因为唯一TableRow正确的是最后一个。但是当我使用时,.setText(btnId + tableRowId)我可以看到它们一直都有相同的 id。

我也尝试使用 Tag,但我偶然发现了同样的问题。

非常感谢!

编辑:

btnDelete = new Button(this);
btnDelete.setId(revolutionCounter);
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT,
                        RelativeLayout.TRUE);
params.addRule(RelativeLayout.CENTER_VERTICAL);

btnDelete.setLayoutParams(params);
rel.addView(btnDelete);//a relativelayout inside the tablerow
tr.addView(rel);

然后我将 tr (tablerow) 添加到 tablelayout。所以我想我正在重用按钮?我应该如何去创造新的?我以为这就是我正在做的new Button(this);

4

1 回答 1

1

几种解决方案

  • 而不是捕获表格行上的长按,而是通过执行直接在删除按钮上捕获它

btndelete.setDuplicateParentStateEnabled(true)

Button.setDuplicateParentStateEnabled(布尔值)

在 btnDelete 上添加一个 LongClickListener 并将可见性设置为可见/不可见,切换它或您想做的任何事情。如果您需要访问 longclickListener 中的表格行,请调用

TableRow tableRow = (TableRow) view.getParent();

  • 如果您想将 longclicklistener 保留在 TableRow 上,您可以通过以下方式访问其 btnDelete 子项:

    Button btnDelete = view.findViewById(view.getId());

PS。不确定这是否是一个问题,但您仍在破坏以前的删除按钮。代替

btnDelete = new Button(this);

你需要重新声明它

Button btnDelete = new Button(this);

也许这并不重要,可能每一行都存储了按钮对象的值(否则它甚至不会显示),但在其他情况下,这让我有些头疼。在这种情况下,可能可以重用变量声明。

于 2011-06-06T14:47:15.200 回答