Как мне создать простой TableLayout в Android?

В таблице, которую я ищу, есть несколько строк, каждая из которых имеет несколько столбцов, размер которых должен автоматически генерироваться, чтобы они отображались с максимальной шириной, необходимой для их отображения, и один из которых должен расширяться/сокращаться до заполнить оставшееся пространство.

Я попытался добиться этого, пометив расширяющийся/сжимающийся столбец как сжимаемый и растягиваемый. Но это, похоже, не работает - когда таблица шире доступного пространства, столбец не сжимается, а вместо этого таблица обрезается с правой стороны, при этом несколько столбцов не видны.

Любые указатели относительно того, где я мог пойти не так с этим?


person Adrian    schedule 14.03.2014    source источник


Ответы (4)


Вы можете попробовать использовать вес макета для ячеек. Что-то вроде показанного ниже

private static int COLUMN_WEIGHT_1 = 3;
private static int COLUMN_WEIGHT_2 = 1;
private static int COLUMN_WEIGHT_3 = 2;

// this column will stretch to fill the space
private static int COLUMN_WEIGHT_4 = 0;

private void populatePriceTable(){
    TableLayout prices = (TableLayout)findViewById(R.id.pricetable);
    prices.setStretchAllColumns(true);
    prices.bringToFront();

    TableRow tr =  new TableRow(this);
    TextView c1 = new TextView(this);
    c1.setText("A cell");
    TextView c2 = new TextView(this);
    c2.setText("A large cell");
    c2.setGravity(Gravity.CENTER_HORIZONTAL);
    TextView c3 = new TextView(this);
    c3.setText("Another large cell");
    TextView c4 = new TextView(this);
    c4.setGravity(Gravity.RIGHT);
    c4.setText("Filler");
    c1.setLayoutParams( new TableRow.LayoutParams( 0 , android.view.ViewGroup.LayoutParams.WRAP_CONTENT, COLUMN_WEIGHT_1) );
    c2.setLayoutParams( new TableRow.LayoutParams( 0 , android.view.ViewGroup.LayoutParams.WRAP_CONTENT, COLUMN_WEIGHT_2) );
    c3.setLayoutParams( new TableRow.LayoutParams( 0 , android.view.ViewGroup.LayoutParams.WRAP_CONTENT, COLUMN_WEIGHT_3) );
    c4.setLayoutParams( new TableRow.LayoutParams( 0 , android.view.ViewGroup.LayoutParams.WRAP_CONTENT, COLUMN_WEIGHT_4) );
    tr.addView(c1);
    tr.addView(c2);
    tr.addView(c3);
    tr.addView(c4);
    tr.setLayoutParams(new TableRow.LayoutParams(android.view.ViewGroup.LayoutParams.MATCH_PARENT, android.view.ViewGroup.LayoutParams.WRAP_CONTENT));
    prices.addView(tr);     
}
person Tau    schedule 24.03.2014
comment
Это не совсем то, что мне нужно, но очень близко к этому; явная установка весов в сочетании с маркировкой того, какие столбцы являются растягиваемыми/сжимаемыми, кажется, хорошо справилась с задачей. Возникает несколько проблем с макетом в моих ячейках, но это определенно указывает мне правильное направление — теперь я вижу все ячейки нужного размера в нужных местах. Спасибо за указатель. - person Adrian; 24.03.2014

Недавно мне пришлось столкнуться с аналогичным требованием для приложения, и я, наконец, смог заставить его работать. В моем случае мне нужно было создать один TableLayout и динамически добавлять TableRow в зависимости от ширины экрана. View, добавленные к TableRow, были TextView с установленным свойством layout_weight, поэтому мне пришлось поиграть с количеством элементов, отображаемых в строке, и, наконец, я смог настроить желаемый макет.

Я вставлю свой код и объясню, что я делаю на каждом этапе:

// The following code block is to dynamically get the width of the screen.
// The width param will be reachable within the `params.width` property    

final Display display = getWindowManager().getDefaultDisplay();
final Point size = new Point();
display.getSize(size);

final WindowManager.LayoutParams params = getWindow().getAttributes();

// So now I have to take the TableLayout and add TableRows dynamically. I'll be adding
// TextViews to the row with the texts present at myItems

TableLayout myTableLayout = (TableLayout) findViewById(R.id.table_layout);
TableRow currentRow = new TableRow(this);
int currentWidth = 0;

for (final String item : myItems) {
  // Define the TextView
  final TextView tv = new TextView(this);
  tv.setBackground(getResources().getDrawable(R.drawable.rounded_edges));
  tv.setGravity(Gravity.CENTER);
  tv.setText(item);
  ...

  // This one line is very important, as you're defining the layout params.
  // Make sure that you add the 1f parameter as it represents the weight
  // Each TextView will have the same weight so they will have the same width
  // within the row
  tv.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT, 1f));

  ...

  // Now you check if this cell still fits the TableRow
  // I use the 90% because the TableLayout won't ever be 100% of the screen width
  if (currentWidth + tv.getWidth() < ((int) params.width * 0.9)) {
    // It fits!
    currentRow.addView(tv);
    currentWidth = currentWidth + tv.getWidth();
  }
  else {
    // It doesn't fit. Just add the current row to the TableLayout and go on.
    myTableLayout.add(currentRow);
    currentRow = new TableRow(this);
    currentRow.addView(tv);
    currentWidth = tv.getWidth();
  }
}

// It might happen that once I've ended processing the texts, there's still
// a row pending to add, so if it has any child I add it
if (currentRow.getChildCount() > 0)
  myTableLayout.add(currentRow);
person nKn    schedule 17.03.2014

Вы можете просто иметь ListView и иметь отдельный XML-файл макета, который на самом деле является макетом таблицы.

так как в представлении списка вы можете обрабатывать столько строк, сколько хотите, а макет таблицы сделает его эластичным.

person Jeba Prince    schedule 24.03.2014

Напишите отдельный XML-макет для такой строки.... и используйте родительский атрибут переноса содержимого/заполнения в соответствии с размером текста

  <?xml version="1.0" encoding="utf-8"?>
<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginBottom="3dp"
    android:layout_marginTop="3dp"
    android:background="#FFFFFF" 
    android:id="@+id/row_calender">



        <TextView
            android:id="@+id/tv_ac_sn"
            android:layout_width="35dp"
            android:layout_height="fill_parent"
            android:background="@drawable/border"
            android:gravity="center"
            android:padding="5dp"
            android:textColor="#000000" />

        <TextView
            android:id="@+id/tv_ac_day"
            android:layout_width="85dp"
            android:layout_height="fill_parent"
            android:background="@drawable/border"
            android:gravity="center"
            android:padding="5dp"
            android:textColor="#000000" />

        <TextView
            android:id="@+id/tv_ac_date"
            android:layout_width="85dp"
            android:layout_height="fill_parent"
            android:background="@drawable/border"
            android:gravity="center"
            android:padding="5dp"
            android:textColor="#000000" />

        <TextView
            android:id="@+id/tv_ac_event"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="@drawable/border"
            android:gravity="center"
            android:padding="5dp"`
            android:textColor="#000000" />
    </TableRow>
person Ajay Maurya    schedule 24.03.2014