Search code examples
javaandroiddynamicandroid-tablelayout

Setting table layout through Java dynamically


I need my screen to have a couple of text views defined in the activity layout. Below those views I want to set a table whose number of rows and columns will depend upon the user's input (dynamic).

This code is in the oncreate of the activity

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_home_page);

    TableLayout tableLayout = new TableLayout(getApplicationContext());
    TableRow tableRow;
    TextView textView;

    for (int i = 0; i < no_days; i++) {
        tableRow = new TableRow(getApplicationContext());
        for (int j = 0; j < no_subjects; j++) {
            textView = new TextView(getApplicationContext());
            textView.setText("Hello");
            textView.setPadding(20, 20, 20, 20);
            tableRow.addView(textView);
        }
        tableLayout.addView(tableRow);
    }

    setContentView(tableLayout);

But this code is taking the whole screen and I am unable to have those text views which I have defined in the activity layout.

Here's my activity_home_page.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.attendancerecord.HomePage"
tools:ignore="MergeRootFrame" >

<TextView
    android:id="@+id/textView5"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="10dp"
    android:text="@string/welcome"
    android:textAppearance="?android:attr/textAppearanceLarge" />

<TextView
    android:id="@+id/display_user_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/textView5"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="33dp"
    android:textAppearance="?android:attr/textAppearanceMedium" />

</RelativeLayout>

Solution

  • If you only want your TableLayout to below your TextViews then use LinearLayout with orientation "vertical" in activity_home_page instead of RelativeLayout

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.attendancerecord.HomePage"
    tools:ignore="MergeRootFrame"
    android:orientation="vertical" >
    
    <TextView
        android:id="@+id/textView5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
    
        android:layout_marginTop="10dp"
        android:text="welcome"
        android:textAppearance="?android:attr/textAppearanceLarge" />
    
    <TextView
        android:id="@+id/display_user_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="33dp"
        android:textAppearance="?android:attr/textAppearanceMedium" />
    
    </LinearLayout>
    

    And add mainLinear.addView(tableLayout); at the end of your loop

    LinearLayout  mainLinear = (LinearLayout) findViewById(R.id.container);
    
            for (int i = 0; i < 5; i++) {
                tableRow = new TableRow(getApplicationContext());
                for (int j = 0; j < 4; j++) {
                    textView = new TextView(getApplicationContext());
                    textView.setText("Hello");
                    textView.setPadding(20, 20, 20, 20);
                    tableRow.addView(textView);
                }
                tableLayout.addView(tableRow);
            }
            mainLinear.addView(tableLayout);
    

    And remove setContentView(tableLayout);

    Hope this works