Search code examples
androidxmlandroid-layoutandroid-tablelayoutlayoutparams

Modify columns width from code android


I would like to know if there is a way to modify the width of two columns in a table layout (with three columns in total).

The problem is that every column has the same width and a lot of space is wasted because the first two only contain an id and a date meanwhile the last one contains a multiline description.

This is the code in which the table layout is populated:

tr_head.setLayoutParams(new LayoutParams(
    LayoutParams.MATCH_PARENT,
    LayoutParams.WRAP_CONTENT));

    tr_head.setBackgroundColor(Color.rgb(0, 230, 230));

    TextView lblSystemStoricalHeaderId = new TextView(this);
    lblSystemStoricalHeaderId.setText("ID      ");

    tr_head.addView(lblSystemStoricalHeaderId);

    TextView lblSystemStoricalHeaderData = new TextView(this);
    lblSystemStoricalHeaderData.setText("Data");

    tr_head.addView(lblSystemStoricalHeaderData);

    TextView lblSystemStoricalHeaderDescription = new TextView(this);
    lblSystemStoricalHeaderDescription.setText("      Descrizione");

    tr_head.addView(lblSystemStoricalHeaderDescription);

    tr_head.setMinimumHeight(30);

    tlSystemStorical.addView(tr_head, new TableLayout.LayoutParams(
       LayoutParams.MATCH_PARENT,
           LayoutParams.WRAP_CONTENT));

    for(int i=0;i<reportList.length;i++){

        TableRow tr = new TableRow(this);
        tr.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
                LayoutParams.WRAP_CONTENT));

        TextView lblSystemStoricalId = new TextView(this);
        lblSystemStoricalId.setText(""+reportList[i].getId()+"");

        tr.addView(lblSystemStoricalId);

        TextView lblSystemStoricalData = new TextView(this);
        long dataC = reportList[i].getDate()*1000;
        java.util.Date df = new java.util.Date(dataC);
        String vv = new SimpleDateFormat("dd/MM/yyyy").format(df);
        lblSystemStoricalData.setText(vv);

        tr.addView(lblSystemStoricalData);

        TableRow.LayoutParams tv3Params = new TableRow.LayoutParams();
        tv3Params.width=0;
        tv3Params.weight=1;
        TextView lblSystemStoricalDescription = new TextView(this);
        lblSystemStoricalDescription.setText(""+reportList[i].getReportDescription());
        lblSystemStoricalDescription.setLayoutParams(tv3Params);

        tr.addView(lblSystemStoricalDescription);

        tr.setBackgroundResource(R.drawable.border);
        tr.setMinimumHeight(40);

        tlSystemStorical.addView(tr, new TableLayout.LayoutParams(
                LayoutParams.MATCH_PARENT,
                LayoutParams.WRAP_CONTENT));
    }

and this is the xml file:

<ScrollView 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/scroll_view_system_description"
     >

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
         >

        <TableLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:stretchColumns="*"
            android:id="@+id/tl_system_storical"
            >

        </TableLayout>
    </FrameLayout>

</ScrollView>


Solution

  • You can set width property to 0 for TableRow children, but specify layout_weight for them. So you'd write:

    float[] weights = new float[] { 0.2f, 0.2f, 0.6f};
    
    TextView lblSystemStoricalId = new TextView(this);
    lblSystemStoricalId.setLayoutParams(new TableRow.LayoutParams(0, ViewGroup.LayoutParams.MATCH_PARENT, weights[0]))
    

    Where 0 is no width for view (because you're using weights), and weights array contains weights for your three views.

    These weights should sum up to 1, and each weight is percent of the width that the column should take. So you need to assign weights to your TableRow children - lblSystemStoricalId would get weights[0], lblSystemStoricalData would get weights[1] and lblSystemStoricalDescription would have weights[2].