фокусируемая строка внутри таблицы android

у меня есть в xml ScrollView, который включает в себя один TableLayout. Мой вопрос в том, возможно ли иметь фокусируемую строку каждый раз, когда я нажимаю на нее. Вот мой xml-код:

    <ScrollView 
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">

        <TableLayout 
            android:id="@+id/table2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >
            <TableRow>
                <RelativeLayout
                    android:id="@+id/rowlayout"
                    android:layout_width="wrap_content"
                    android:layout_height="fill_parent"
                    android:background="@drawable/rowbackground2" >
                        <ImageView
                            android:id="@+id/icon"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:src="@drawable/icon_code_contact" 
                            android:padding="7dip"
                            android:layout_alignParentLeft="true" />

                        <TextView
                            android:id="@+id/contacts"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:textStyle="bold"
                            android:text="Contacts"
                            android:textColor="#000"
                            android:textSize="18dip"
                            android:layout_toRightOf="@id/icon"
                            android:paddingTop="10dip" />

                </RelativeLayout>
            </TableRow>


            <TableRow>
                <Button
                    android:id="@+id/contacts_button"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:background="@drawable/contact_button" />
            </TableRow>

I have already tried the "focusable="true"" and "focusableInTouchMode="true"" but nothing happened..

заранее спасибо


person Nikitas    schedule 02.02.2011    source источник


Ответы (5)


Если вы спрашиваете, как заставить таблицу вести себя как ListView, я сделал следующее:

В xml-файле, который определяет макет для моей деятельности, я определил таблицу:

<ScrollView
    android:layout_height="wrap_content"
    android:layout_width="fill_parent" >
    <TableLayout
        android:id="@+id/my_table"
        android:layout_height="fill_parent"
        android:layout_width="fill_parent"
        android:stretchColumns="1"
        android:shrinkColumns="1"/>
</ScrollView>

Затем я написал отдельный файл table_row_item.xml с разметкой строк таблицы:

<?xml version="1.0" encoding="UTF-8"?>
<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:focusable="true"
    android:focusableInTouchMode="false"
    android:clickable="true"
    android:background="@android:drawable/list_selector_background">

    <TextView
        android:id="@+id/cell_1"
        ...
    />
    ...
    <TextView
        android:id="@+id/cell_N"
        ...
    />
</TableRow>

В Activity я объявил процедуру добавления строки в мою таблицу:

private void addTableRow() {
    final TableLayout table = (TableLayout) findViewById(R.id.my_table);
    final TableRow tr = (TableRow) getLayoutInflater().inflate(R.layout.table_row_item, null);

    TextView tv;
    // Fill out our cells
    tv = (TextView) tr.findViewById(R.id.cell_1);
    tv.setText(...);
    ...
    tv = (TextView) tr.findViewById(R.id.cell_N);
    tv.setText(...);
    table.addView(tr);

    // Draw separator
    tv = new TextView(this);
    tv.setBackgroundColor(Color.parseColor("#80808080"));
    tv.setHeight(/*height of separaor line. 2dip will be enough*/);
    table.addView(tv);

    // If you use context menu it should be registered for each table row
    registerForContextMenu(tr);
}
person GrAnd    schedule 10.03.2011

Вы можете использовать GridView и определить LinearLayout (горизонтальный) в качестве строки. Используйте это как руководство: http://www.learn2crack.com/2014/01/android-custom-gridview.html

person Steph    schedule 06.08.2014

Конечно. Строка имеет свойство onClick, где вы можете указать имя вашего метода onclick.

Другой способ - дать этой строке идентификатор - имя в вашем xml. Затем вы можете вызвать его из кода и добавить событие onClick.

person Lumis    schedule 02.02.2011
comment
Я уже сделал то, что вы сказали об идентификаторе строки, но это не сработало. Моя проблема в том, что я не могу сделать строку доступной при нажатии // - person Nikitas; 02.02.2011
comment
Я не уверен, что вы подразумеваете под fucusable, вы имеете в виду, что он должен показывать, что он выбран? Поскольку у вас есть относительный макет в строке, может случиться так, что какое-то другое представление получит фокус при нажатии. Возможно, другие внутренние представления должны иметь false для интерактивных... - person Lumis; 02.02.2011

Этот код будет переключаться между выбранным вами фоном для рисования (я думаю, вы можете использовать null, чтобы не было фона) и фоном Android по умолчанию «выбранным».

    row.setClickable(true);
    row.setOnTouchListener(new OnTouchListener()
    {

        @Override
        public boolean onTouch(View v, MotionEvent event)
        {
            final int action = event.getAction();
            Log.d("Touched!", "" + action);
            switch (action & MotionEvent.ACTION_MASK)
            {
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
            case MotionEvent.ACTION_OUTSIDE:
                // case MotionEvent.ACTION_MOVE:
                v.setBackgroundResource(R.drawable.border_bottom);
                v.invalidate();
                break;
            default:
                v
                        .setBackgroundResource(android.R.drawable.list_selector_background);
                v.invalidate();

            }
            return false;
        }
    });
person tacone    schedule 08.04.2011

Если вы ищете простое и эффективное решение для отображения данных в таблице, TableView подойдет.

Пример SortableTableView

person Ingo Schwarz    schedule 30.07.2015