Найти кнопку, добавленную в TableRow по идентификатору в OnLongClick в Android? - PullRequest
0 голосов
/ 05 июня 2011

У меня есть TableLayout с динамически добавляемыми TableRows в зависимости от размера курсора.К каждой строке я добавляю кнопку «Удалить», которая имеет значение «Невидимый».Каждая строка и кнопка получают идентификатор при создании, который является одинаковым, если затем принадлежат одной и той же строке.Когда пользователь LongClicks на TableRow, видимость устанавливается вместо Visible, и появляется кнопка Delete.

В прослушивателе OnLongClick я проверяю, совпадает ли идентификатор кнопки с представлением (здесь 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), я вижу, что они имеют одинаковые идентификаторы.

Я тоже пытался использовать 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);

1 Ответ

1 голос
/ 06 июня 2011

Несколько решений

  • Вместо захвата длинного клика по строке таблицы, захватите его непосредственно на кнопке удаления, выполнив

btndelete.setDuplicateParentStateEnabled(true)

Button.setDuplicateParentStateEnabled (логическое значение)

Добавьте LongClickListener в btnDelete и установите видимость Visible / invisible, переключите его или все, что вы хотите сделать.Если вам нужен доступ к строке таблицы внутри 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);

Возможно, это не важно, и, вероятно, каждая строка хранит значение объекта кнопки (в противном случае он даже не отображался бы)), но в других ситуациях это вызвало у меня некоторые головные боли.В этом случае, возможно, можно повторно использовать объявление переменной.

...