Search code examples
androidtextviewwidthtablelayoutfixed

Android: Dynamically add TextView on a TableLayout with fixed Width


I'm facing an issue on my android application. I want to dynamically create TableRow in a TableLayout. Each of this row needs to contain 4 TextViews. I want the TextView like this:

  • textview1: 40% of the screen
  • textview2: 10% of the screen
  • textview3: 10% of the screen
  • textview5: 40% of the screen

I manage to create the Tewtview dynamically but the size are not respected. For example if my first textview contains a big text, it covers all the screen instead of only 40% and multiline.

I read a lot of similar questions but can't find the solution here. Here is my layout file:

    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:stretchColumns="1"
android:layout_marginLeft="10dip"
android:layout_marginRight="10dip"
android:layout_marginBottom="30dip"
android:id="@+id/journee_contenu">

<TableRow>
  <!-- Column 1 -->
  <TextView
     android:id="@+id/tbl_txt1"
     android:layout_width="0dip"
     android:layout_height="wrap_content"
     android:layout_weight="4"
     android:text="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
      />

  <!-- Column 2 -->
  <TextView
     android:id="@+id/tbl_txt2"
     android:layout_width="0dip"
     android:layout_height="wrap_content"
     android:layout_weight="1"
     android:text="bbbbb"
     />

  <!-- Column 3 -->
  <TextView
     android:id="@+id/tbl_txt3"
     android:layout_width="0dip"
     android:layout_height="wrap_content"
     android:layout_weight="1"
     android:text="ccccc"
      />
      <!-- Column 4 -->
  <TextView
     android:id="@+id/tbl_txt4"
     android:layout_width="0dip"
     android:layout_height="wrap_content"
     android:layout_weight="4"
     android:text="ddddddddddddddddddddddddddddddddddddddddddddddd"
      />
</TableRow>

The Layout creates a static tab with a first row that is as I want it to be. But the rows added dynamically are not behaving the same way.

My dynamic code:

    TableLayout genLayout = (TableLayout) findViewById(R.id.journee_contenu);
for (MatchWrapper match : matchs) {
    TableRow tr1 = new TableRow(this);
    TextView tvEq1 = new TextView(this);
    tvEq1.setText(match.getEquipe1());
    TextView tvSc1 = new TextView(this);
    tvSc1.setText(match.getScore_equipe1());
    TextView tvSc2 = new TextView(this);
    tvSc2.setText(match.getScore_equipe2());
    TextView tvEq2 = new TextView(this);
    tvEq2.setText(match.getEquipe2());
    tr1.addView(tvEq1);
    tr1.addView(tvSc1);
    tr1.addView(tvSc2);
    tr1.addView(tvEq2);
    genLayout.addView(tr1);
}

My match object is only containing string with various size. Thanks a lot for your help


Solution

  • The reason your dynamicly added TableRows don't do as you would like is that you do not set the LayoutParams for the TableRow nor the TextViews.

    On each TextView you add LayoutParams like this:

    tvEq1.setLayoutParams( new TableRow.LayoutParams( 0, android.view.ViewGroup.LayoutParams.WRAP_CONTENT, 4 ) );
    tvSc1.setLayoutParams( new TableRow.LayoutParams( 0, android.view.ViewGroup.LayoutParams.WRAP_CONTENT, 1 ) );
    tvSc2.setLayoutParams( new TableRow.LayoutParams( 0, android.view.ViewGroup.LayoutParams.WRAP_CONTENT, 1 ) );
    tvEq2.setLayoutParams( new TableRow.LayoutParams( 0, android.view.ViewGroup.LayoutParams.WRAP_CONTENT, 4 ) );
    

    The last parameter of the LayoutParams-constructor is the layout_weight.

    You need to add the LayoutParams before addind the TextViews to the TableRow.

    You might need to add LayoutParams to your TableRow aswell.