Добавление пространства между столбцами TableLayout - PullRequest
13 голосов
/ 02 апреля 2012

У меня есть TableLayout, куда я динамически добавляю TableRows.В каждой TableRow я добавляю Button.

Я просто хотел бы добавить пробел между столбцами (которые являются моими кнопками), но я не могу понять, как ... Я пытался изменить всевозможные поля, но это не работает :( Так что, возможно, я допустил ошибку в своем коде, когда я надувал их из файлов XML:

private void createButtons(final CategoryBean parentCategory) {
    final List<CategoryBean> categoryList = parentCategory.getCategoryList();
    title.setText(parentCategory.getTitle());
    // TODO à revoir
    int i = 0;
    TableRow tr = null;
    Set<TableRow> trList = new LinkedHashSet<TableRow>();
    for (final CategoryBean category : categoryList) {

        TextView button = (TextView) inflater.inflate(R.layout.button_table_row_category, null);
        button.setText(category.getTitle());
        if (i % 2 == 0) {
            tr = (TableRow) inflater.inflate(R.layout.table_row_category, null);
            tr.addView(button);
        } else {
            tr.addView(button);
        }

        trList.add(tr);

        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                CategoryBean firstChild = category.getCategoryList() != null && !category.getCategoryList().isEmpty() ? category
                        .getCategoryList().get(0) : null;
                if (firstChild != null && firstChild instanceof QuestionsBean) {
                    Intent intent = new Intent(CategoryActivity.this, QuestionsActivity.class);
                    intent.putExtra(MainActivity.CATEGORY, category);
                    startActivityForResult(intent, VisiteActivity.QUESTION_LIST_RETURN_CODE);
                } else {
                    Intent intent = new Intent(CategoryActivity.this, CategoryActivity.class);
                    intent.putExtra(MainActivity.CATEGORY, category);
                    startActivityForResult(intent, VisiteActivity.CATEGORY_RETURN_CODE);
                }
            }
        });
        i++;
    }
    for (TableRow tableRow : trList) {
        categoryLaout.addView(tableRow);
    }
}

My button_table_row_category.xml:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/buttonTableRowCategory"
    style="@style/ButtonsTableRowCategory"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:text="@string/validate" />

My table_row_category.xml:

<?xml version="1.0" encoding="utf-8"?>
<TableRow xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tableRowCategory"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="100dp"
    android:gravity="center"
    android:padding="5dp" >

</TableRow>

Спасибо за помощь.

Ответы [ 4 ]

14 голосов
/ 03 апреля 2012

В случае TableLayout сами кнопки являются столбцами.Это означает, что вы должны посоветовать кнопкам сохранить некоторое пространство между ними.Вы можете сделать это с помощью параметров макета.Их намного проще установить в XML, но это также работает программно.Важно, чтобы вы всегда использовали класс LayoutParam родительского макета элемента, к которому вы его применили - в этом случае родительским объектом является TableRow:

// Within createButtons():
android.widget.TableRow.LayoutParams p = new android.widget.TableRow.LayoutParams();
p.rightMargin = DisplayHelper.dpToPixel(10, getContext()); // right-margin = 10dp
button.setLayoutParams(p);

// DisplayHelper:
private static Float scale;
public static int dpToPixel(int dp, Context context) {
    if (scale == null)
        scale = context.getResources().getDisplayMetrics().density;
    return (int) ((float) dp * scale);
}

Большинство атрибутов измерения в Androidбрать пиксели, если вы устанавливаете их программно - поэтому вы должны использовать что-то вроде моего метода dpToPixel ().Пожалуйста, никогда не используйте значения пикселей в Android!Вы пожалеете об этом позже.

Если вы не хотите, чтобы крайняя правая кнопка имела это поле, просто проверьте с IF и не добавляйте LayoutParam на нем.


Решение в XML:

Чтобы не допустить удаления LayoutInflater определенных вами XML-атрибутов, делайте это во время надувания (взято из Параметры макета загруженного представления игнорируются ):

View view = inflater.inflate( R.layout.item /* resource id */,
                                     MyView.this /* parent */,
                                     false /*attachToRoot*/);

Альтернатива : использовать GridView примерно так: Android: простой GridView, отображающий текст в сетках

9 голосов
/ 15 марта 2013

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

<TableRow
    android:id="@+id/tableRow1">

    <TextView
        android:id="@+id/textView1"
        android:paddingRight="20dp" />

 </TableRow>
2 голосов
/ 06 февраля 2015

Попробуйте android:layout_marginRight="6dp" это сработало для меня.

0 голосов
/ 19 августа 2014

Попробуйте использовать функцию setColumnStretchable TableLayout. Присвойте ему индекс columnn и установите для его свойства растяжения значение true.

Например. Если у вас есть 3 столбца.

TableLayout tblLayout;
tblLayout.setColumnStretchable(0, true);
tblLayout.setColumnStretchable(1, true);
tblLayout.setColumnStretchable(2, true);

Выше приведено равное расстояние между всеми 3 столбцами tableLayout.

...