2

Я работаю в приложении для Android, и я хочу добавить TableRow программно в свой TableLayout.Добавление TableRow программно в Android

У меня есть этот TableLayout:

<TableLayout 
android:id="@+id/details_table" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent"> 

<TableRow> 
    <TextView 
     android:text="4686" 
     android:layout_width="wrap_content" 
     android:layout_column="0" 
     android:layout_weight="1" 
     android:textSize="7px" 
     android:textColor="@color/black" /> 
    <TextView 
     android:text="sdhiuf osdfh isdhf ihdf" 
     android:layout_width="wrap_content" 
     android:layout_column="1" 
     android:layout_weight="1" 
     android:textSize="7px" 
     android:textColor="@color/black" /> 
    <TextView 
     android:text="2" 
     android:layout_width="wrap_content" 
     android:layout_column="2" 
     android:layout_weight="1" 
     android:textSize="7px" 
     android:textColor="@color/black" /> 
    <TextView 
     android:text="UN" 
     android:layout_width="wrap_content" 
     android:layout_column="3" 
     android:layout_weight="1" 
     android:textSize="7px" 
     android:textColor="@color/black" /> 
</TableRow> 

и я хочу, чтобы добавить это именно TableRow программно.

Я пытаюсь что-то вроде этого:

TableLayout detailsTable = (TableLayout) l.findViewById(R.id.details_table); 

for(Nfce_Product nfceProduct : nfceProducts){ 
    TableRow tableRow = new TableRow(getActivity()); 

    TextView tvProductCode = new TextView(getActivity()); 
    tvProductCode.setLayoutParams(new TableRow.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, TableLayout.LayoutParams.WRAP_CONTENT, 1f)); 
    tvProductCode.setText(nfceProduct.getProduct_code()); 
    tvProductCode.setTextSize(TypedValue.COMPLEX_UNIT_PX, productDetailsTextSize); 
    tvProductCode.setTextColor(getResources().getColor(R.color.black)); 

    TextView tvProductDescription = new TextView(getActivity()); 
    tvProductDescription.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, TableLayout.LayoutParams.WRAP_CONTENT, 1f)); 
    tvProductDescription.setText(nfceProduct.getProduct_description()); 
    tvProductDescription.setTextSize(TypedValue.COMPLEX_UNIT_PX, productDetailsTextSize); 
    tvProductDescription.setTextColor(getResources().getColor(R.color.black)); 

    TextView tvProductAmount = new TextView(getActivity()); 
    tvProductAmount.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, TableLayout.LayoutParams.WRAP_CONTENT, 1f)); 
    tvProductAmount.setText(String.valueOf(nfceProduct.getAmount())); 
    tvProductAmount.setTextSize(TypedValue.COMPLEX_UNIT_PX, productDetailsTextSize); 
    tvProductAmount.setTextColor(getResources().getColor(R.color.black)); 

    TextView tvProductMetric = new TextView(getActivity()); 
    tvProductMetric.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, TableLayout.LayoutParams.WRAP_CONTENT, 1f)); 
    tvProductMetric.setText(nfceProduct.getProduct_metric()); 
    tvProductMetric.setTextSize(TypedValue.COMPLEX_UNIT_PX, productDetailsTextSize); 
    tvProductMetric.setTextColor(getResources().getColor(R.color.black)); 

    tableRow.addView(tvProductCode); 
    tableRow.addView(tvProductDescription); 
    tableRow.addView(tvProductAmount); 
    tableRow.addView(tvProductMetric); 
    detailsTable.addView(tableRow); 
} 

Спасибо.

+0

Еще одна вещь, вам понадобится высота макета для каждого из ваших текстовых просмотров. –

+0

Какая ошибка вы видите? –

+0

TableRow просто не отображается –

ответ

5

Here is my own answer к моему собственному динамически созданному TableRow вопрос. Я думаю, что мой ответ достаточно подробный, у вас не должно возникнуть проблем с его использованием! Моя проблема включала не только динамическое создание TableRows, но и возможность касаться каждой строки и что-то случилось. Я пошел дальше, чем сейчас, чтобы каждый КЛЕТ отдельно обращался.

Редактировать: Вам необходимо иметь отдельный файл TableRowXML, к которому вы можете получить доступ, отдельно от фактического TableLayout, который вы пытаетесь динамически заполнить.

Edit2: Я, вероятно, следует попытаться сделать фактическое решение для вас, так что вы видите, что я говорю о:

Во-первых, создать (или сохранить) файл, содержащий XML ваш TableLayout. Во-вторых, создайте отдельный файл TableRowXML.

(Это ваш потенциальный tablerow.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" > 
    <TextView 
     android:id="@+id/tableCell1" 
     android:layout_width="wrap_content" 
     android:layout_column="0" 
     android:layout_weight="1" 
     android:textSize="7px" 
     android:textColor="@color/black" /> 

    <TextView 
     android:id="@+id/tableCell2" 
     android:layout_width="wrap_content" 
     android:layout_column="1" 
     android:layout_weight="1" 
     android:textSize="7px" 
     android:textColor="@color/black" /> 

    <TextView 
     android:id="@+id/tableCell3" 
     android:layout_width="wrap_content" 
     android:layout_column="2" 
     android:layout_weight="1" 
     android:textSize="7px" 
     android:textColor="@color/black" /> 

    <TextView 
     android:id="@+id/tableCell4" 
     android:layout_width="wrap_content" 
     android:layout_column="3" 
     android:layout_weight="1" 
     android:textSize="7px" 
     android:textColor="@color/black" /> 
</TableRow> 

Теперь ... обратно в реальный код!

for (Nfce_Product nfceProduct : nfceProducts) { 
    final TableLayout detailsTable = (TableLayout) findViewById(R.id.details_table); 
    final TableRow tableRow = (TableRow) getLayoutInflater().inflate(R.layout.tablerow, null); 
    TextView tv; 

    //Filling in cells 
    tv = (TextView) tableRow.findViewById(R.id.tableCell1); 
    tv.setText(nfceProduct.getProduct_code()); 

    tv = (TextView) tableRow.findViewById(R.id.tableCell2); 
    tv.setText(nfceProduct.getProduct_description()); 

    tv = (TextView) tableRow.findViewById(R.id.tableCell3); 
    tv.setText(nfceProduct.getAmount()); 

    tv = (TextView) tableRow.findViewById(R.id.tableCell4); 
    tv.setText(nfceProduct.getProduct_metric()); 

    //Add row to the table 
    detailsTable.addView(tableRow); 
} //End for 

Если вам все еще нужно/хочу, чтобы изменить размер и цвет текста, вы можете сделать это после setText() линии и, прежде чем делать findViewById снова. Если вы хотите иметь заголовки столбцов, которые в основном говорят «Код», «Описание», «Сумма» и «Метрика», сделайте TableRow внутри TableLayout, как сейчас. Созданный программно TableRows будет падать в строке после этой строки «заголовка».

Смежные вопросы