Как я могу выделить строку таблицы при нажатии?

В качестве требования моего проекта я должен выделить строку таблицы на onClick. Есть ли способ сделать это? Или, пожалуйста, предложите мне альтернативу?


person Ravi    schedule 02.11.2010    source источник
comment
Немного поздно, но проверьте ответ этой темы: stackoverflow.com/questions/6274343/   -  person Arnaud    schedule 22.07.2011
comment
Вы можете обратиться к этой ссылке и обратиться к ответу, данному Джошем Клеммом.   -  person prateek    schedule 07.04.2012
comment
см. отредактированный ответ здесь: stackoverflow.com/a/7022137/2469134   -  person Hesham Yassin    schedule 12.03.2017


Ответы (5)


Если вы хотите использовать подсветку акций при нажатии, как в общем ListView, вы хотите установить фон каждой строки как android:background="@android:drawable/list_selector_background"

Вот пример:

<TableLayout
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:stretchColumns="0">
  <TableRow
     android:id="@+id/first_row"
     android:background="@android:drawable/list_selector_background" >
    ... row content ...
  </TableRow>
</TableLayout>

Затем в коде

TableRow firstRow = (TableRow) findViewById(R.id.first_row);
firstRow.setOnClickListener(new OnClickListener() {
       @Override
        public void onClick(View v) {
            // TODO: do your logic here

        }   
}

И вы должны получить строку с возможностью выделения, как в ListView...

РЕДАКТИРОВАТЬ: Выше приведен селектор фона списка тем по умолчанию. Если вам нужен более общий селектор (например, селектор дизайна материала, когда пользователь касается строки), используйте это:

android:background="?android:attr/selectableItemBackground"

Также это относится не только к TableRows. Вы должны иметь возможность сделать это практически для любого универсального виджета с прикрепленным onClickListener (текстовые представления, кнопки и т. д.).

person Salil Pandit    schedule 20.11.2011
comment
Вы, очевидно, не тестировали это. Все, что он делает, это устанавливает цвет фона строки таблицы и добавляет в строку прослушиватель кликов, ничего больше. - person b1nary.atr0phy; 10.02.2012
comment
Я протестировал его - и он довольно успешно используется в производстве. Вы правы, это ДЕЙСТВИТЕЛЬНО устанавливает фон. То, что он устанавливает, является ключом - @android:drawable/list_selector_background является стандартным выделением темы телефона, когда вы нажимаете на запись в ListView. Любопытно, прежде чем оставить комментарий, ВЫ его проверяли? - person Salil Pandit; 10.02.2012
comment
Я протестировал его, и он работает. Это именно то, что я искал: поведение кнопки для TableRow. - person Lekensteyn; 05.04.2012
comment
Вы можете выбрать или изменить цвет выделения по умолчанию? - person topwik; 27.08.2012
comment
Интересно, насколько рискованно ссылаться на макеты андроида в коде? Могут ли они не меняться/быть разными в разных версиях Android? - person AgentKnopf; 13.01.2013
comment
Это ведет себя несколько иначе, чем поведение ListView на моем Nexus 5. Я вижу оранжевый цвет фона, а не голубой цвет моего ListView. Кроме того, ListView, похоже, передает изменение цвета вложенным элементам. - person theblang; 13.06.2014
comment
Это также не работает для меня. Nexus 5 – работающий леденец. Я использую appcompat. У меня появляется желтый фон при нажатии, и он сразу исчезает. Возможно ли обновление для более новых версий ОС? - person lostintranslation; 27.05.2015

Даже я столкнулся с той же проблемой с помощью ответа Салила Пандита, внесшего в нее небольшое изменение, и это работает для меня.

Это TableRow в xml:

<TableRow
        android:id="@+id/tableRow1"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:padding="5dip" 
        android:background="@drawable/selector">

Это selector.xml в папке res\drawable

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item   android:state_focused="true"
            android:state_pressed="true"
            android:drawable="@android:drawable/list_selector_background"></item>
    <item   android:state_focused="true"
            android:state_pressed="false"
            android:drawable="@android:drawable/list_selector_background"></item>
    <item
            android:state_focused="false"
            android:state_pressed="true"
            android:drawable="@android:drawable/list_selector_background" />


     <item android:drawable="@android:drawable/list_selector_background"></item>

</selector>
person Zombie    schedule 19.12.2012
comment
удалось следовать, но помните, что во время создания селектора в папке с возможностью рисования создайте selector.xml в качестве ресурса для рисования. - person Alia Ramli Ramli; 08.07.2015

В onclicklistener добавьте:

 tr1.setBackgroundResource(drawable.list_selector_background);

Где tr1 - ваша таблица. (вам нужно будет сделать tablerow окончательным, чтобы он работал).

person Denis    schedule 18.04.2012
comment
спасибо, но когда я нажимаю на строку, она выделяется, а затем снова не выделяется! - person Hesham Yassin; 12.03.2017

Программная версия @SalilPandit с селектором строк:

final TableRow row = new TableRow(this);

row.setBackgroundResource(android.R.drawable.list_selector_background);

row.setOnClickListener(new View.OnClickListener(){            

     @Override
     public void onClick(View view){
         row.setFocusable(true);
         // TODO
     }
});

Для универсального селектора (материальный дизайн):

TypedValue typeValue = new TypedValue();
this.getTheme().resolveAttribute(android.R.attr.selectableItemBackground,
                                 typeValue, true);

final TableRow row = new TableRow(this);
row.setBackgroundResource(typeValue.resourceId);

row.setOnClickListener(new View.OnClickListener(){

    @Override
    public void onClick(View view){
          row.setFocusable(true);
          // TODO
    }
});
person Ahtisham    schedule 09.06.2020

person    schedule
comment
это работает. макет таблицы прослушивателя строки onclick и поместите в него этот код. - person Bhhruguni; 02.06.2017