'Dynamically generate Relative Layout in Android

I want to know how to dynamically generate the Relative Layout for my application. I want to generate a new Relative layout for each item i get from server.

My XML view which i want to generate is as follows:

<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
android:background="#FFFFFF"
tools:context=".MainActivity"
android:id="@+id/Main_Layout">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:id="@+id/question_content"
    >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/questions">
        <!-- Month and Year on the top -->
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#22C778"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="December 2014"
            android:gravity="center"
            android:id="@+id/month_name"
            android:padding="5dp"
            android:textColor="#FFFFFF"
            android:layout_alignParentTop="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true" />

        <!-- Date and Month On The Left -->

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="30 Jan"
            android:gravity="center_vertical"
            android:background="#F1F1F1"
            android:padding="10dp"
            android:layout_marginTop="5dp"
            android:id="@+id/date_text"
            android:layout_below="@+id/month_name"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            />

        <!-- Question Title  -->
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="#FFFFFF"
            android:padding="5dp"
            android:text="This Is The Title Of Question Of January"
            android:id="@+id/question_title"
            android:layout_alignTop="@+id/date_text"
            android:layout_toRightOf="@+id/date_text" />

        <!--  Question Description -->
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:text="This Is The Description Of The Question You See Above And Below Is The Rating Bar"
            android:id="@+id/question_desc"
            android:layout_below="@+id/question_title"
            android:layout_toRightOf="@+id/date_text"
            android:layout_toEndOf="@+id/date_text" />

        <RatingBar
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/question_rating"
            android:numStars="1"
            android:stepSize="1"
            android:layout_marginLeft="10dp"
            android:layout_below="@+id/question_desc"
            android:layout_alignLeft="@+id/question_desc"
            android:layout_alignStart="@+id/question_desc"

            />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:text="0 people rated this question"
            android:id="@+id/people_rated"
            android:padding="15dp"
            android:layout_alignBottom="@id/question_rating"
            android:layout_below="@+id/question_desc"
            android:layout_toRightOf="@id/question_rating" />
    </RelativeLayout>

I tried doing this in java code: i want to create layout inside android:id="@+id/question_content" dynamically

    RelativeLayout Questions_Layout=new RelativeLayout(this);
    RelativeLayout.LayoutParams params=new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
            RelativeLayout.LayoutParams.WRAP_CONTENT);

    for(int i=0;i<4;i++)
    {
        //Setting Parameters For TextViews
        //Month and Year TextView " DEC 2014

        TextView month_name = new TextView(this);
        month_name.setText("Jan 2014");
        month_name.setId(R.id.ques_title);
        month_name.setPadding(5, 5, 5, 5);
        month_name.setGravity(Gravity.CENTER);
        month_name.setBackgroundColor(Color.parseColor("#22C778"));
        month_name.setTextColor(Color.parseColor("#FFFFFF"));
        month_name.setTextAppearance(this, android.R.style.TextAppearance_Medium);
        params.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
        params.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
        params.addRule(RelativeLayout.ALIGN_PARENT_START, RelativeLayout.TRUE);
        month_name.setLayoutParams(params);


        //Adding Text View To Relative Layout
        Questions_Layout.addView(month_name);


        //Setting Parameters For TextViews
        //Date and Month TextView " 12 DEC
        TextView Day_Month= new TextView(this);

        Day_Month.setText("12 Jan");
        Day_Month.setId(R.id.day_month);
        Day_Month.setPadding(10, 10, 10, 10);
        params.setMargins(0, 5, 0, 0);
        Day_Month.setGravity(Gravity.CENTER_VERTICAL);
        Day_Month.setBackgroundColor(Color.parseColor("#F1F1F1"));
        Day_Month.setTextAppearance(this, android.R.style.TextAppearance_Medium);
        params.removeRule(RelativeLayout.ALIGN_PARENT_TOP);
        params.addRule(RelativeLayout.BELOW,R.id.month_year);
        Day_Month.setLayoutParams(params);
        Questions_Layout.addView(Day_Month);

        //Setting Parameters For TextViews
        //Question Title TextView "This Is Title Of The Question

        TextView Ques_Title=new TextView(this);
        Ques_Title.setId(R.id.ques_title);
        Ques_Title.setText("This Is The Title");
        Ques_Title.setPadding(5, 5, 5, 5);
        Ques_Title.setBackgroundColor(Color.parseColor("#FFFFFF"));
        params.removeRule(RelativeLayout.BELOW);
        params.removeRule(RelativeLayout.ALIGN_PARENT_LEFT);
        params.removeRule(RelativeLayout.ALIGN_PARENT_START);
        params.addRule(RelativeLayout.ALIGN_TOP,R.id.day_month);
        params.addRule(RelativeLayout.RIGHT_OF,R.id.day_month);
        Ques_Title.setLayoutParams(params);
        Questions_Layout.addView(Ques_Title);
        //Setting Parameters For TextViews
        //Question Description TextView "This Is Description Of The Question

        TextView Ques_Desc=new TextView(this);
        Ques_Desc.setId(R.id.ques_desc);
        Ques_Desc.setText("This Is The Description Of Question");
        Ques_Desc.setPadding(10, 10, 10, 10);
        Ques_Desc.setBackgroundColor(Color.parseColor("#FFFFFF"));
        params.removeRule(RelativeLayout.RIGHT_OF);
        params.removeRule(RelativeLayout.ALIGN_TOP);
        params.addRule(RelativeLayout.BELOW,R.id.ques_title);
        params.addRule(RelativeLayout.RIGHT_OF,R.id.day_month);
        params.addRule(RelativeLayout.END_OF,R.id.day_month);
        Ques_Desc.setLayoutParams(params);
        Questions_Layout.addView(Ques_Desc);


        RatingBar ratingBar=new RatingBar(this);
        ratingBar.setId(R.id.rating_bar);
        ratingBar.setNumStars(1);
        ratingBar.setStepSize(1);
        params.setMargins(10,0,0,0);
        params.removeRule(RelativeLayout.ALIGN_LEFT);
        params.removeRule(RelativeLayout.BELOW);
        params.removeRule(RelativeLayout.START_OF);
        params.addRule(RelativeLayout.ALIGN_LEFT,R.id.ques_desc);
        params.addRule(RelativeLayout.BELOW,R.id.ques_desc);
        params.addRule(RelativeLayout.START_OF,R.id.ques_desc);
        ratingBar.setLayoutParams(params);
        Questions_Layout.addView(ratingBar);


        //Setting Parameters For TextViews
        //People Rated TextView "3 people Rated This"

        TextView People_Rated=new TextView(this);
        People_Rated.setId(R.id.people_rated);
        People_Rated.setText("9 People Rated This");
        People_Rated.setPadding(15, 15, 15, 15);
        People_Rated.setBackgroundColor(Color.parseColor("#FFFFFF"));
        params.removeRule(RelativeLayout.RIGHT_OF);
        params.removeRule(RelativeLayout.BELOW);
        params.addRule(RelativeLayout.BELOW,R.id.ques_desc);
        params.addRule(RelativeLayout.ALIGN_TOP,R.id.rating_bar);
        params.addRule(RelativeLayout.RIGHT_OF,R.id.rating_bar);
        People_Rated.setLayoutParams(params);
        Questions_Layout.addView(People_Rated);




    }
    LinearLayout base=(LinearLayout) findViewById(R.id.question_content);
    base.addView(Questions_Layout);

   // LinearLayout main=(LinearLayout) findViewById(R.id.question_content);
   // main.addView(sv);
    setContentView(R.layout.activity_main);
    ViewGroup container = (ViewGroup)findViewById(R.id.question_content);
    container.addView(Questions_Layout);

but it's not working. Am i doing something wrong. Please suggest something



Solution 1:[1]

setContentView(R.layout.activity_main); should be before LinearLayout base=(LinearLayout) findViewById(R.id.question_content); otherwise base will return value as null.

There is some more issues, create params object every time you are adding it, you are creating Questions_Layout view outside for loop. It should be inside for loop and base.addView(Questions_Layout); should also be inside for loop. Please check the corrected answer.

setContentView(R.layout.activity_main);

LinearLayout base=(LinearLayout) findViewById(R.id.question_content);

for(int i=0;i<4;i++)
{
    RelativeLayout Questions_Layout=new RelativeLayout(this);
    
    //Setting Parameters For TextViews
    //Month and Year TextView " DEC 2014

    TextView month_name = new TextView(this);
    month_name.setText("Jan 2014");
    month_name.setId(R.id.ques_title);
    month_name.setPadding(5, 5, 5, 5);
    month_name.setGravity(Gravity.CENTER);
    month_name.setBackgroundColor(Color.parseColor("#22C778"));
    month_name.setTextColor(Color.parseColor("#FFFFFF"));
    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
        RelativeLayout.LayoutParams.WRAP_CONTENT);
    month_name.setTextAppearance(this, android.R.style.TextAppearance_Medium);
    params.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE);
    params.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
    params.addRule(RelativeLayout.ALIGN_PARENT_START, RelativeLayout.TRUE);
    //Adding Text View To Relative Layout
    Questions_Layout.addView(month_name);
    month_name.setLayoutParams(params);


    //Setting Parameters For TextViews
    //Date and Month TextView " 12 DEC
    TextView Day_Month = new TextView(this);

    Day_Month.setText("12 Jan");
    Day_Month.setId(R.id.day_month);
    Day_Month.setPadding(10, 10, 10, 10);
    params.setMargins(0, 5, 0, 0);
    Day_Month.setGravity(Gravity.CENTER_VERTICAL);
    Day_Month.setBackgroundColor(Color.parseColor("#F1F1F1"));
    Day_Month.setTextAppearance(this, android.R.style.TextAppearance_Medium);
    params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
        RelativeLayout.LayoutParams.WRAP_CONTENT);
    params.removeRule(RelativeLayout.ALIGN_PARENT_TOP);
    params.addRule(RelativeLayout.BELOW,R.id.month_year);
    Questions_Layout.addView(Day_Month);
    Day_Month.setLayoutParams(params);

    //Setting Parameters For TextViews
    //Question Title TextView "This Is Title Of The Question

    TextView Ques_Title = new TextView(this);
    Ques_Title.setId(R.id.ques_title);
    Ques_Title.setText("This Is The Title");
    Ques_Title.setPadding(5, 5, 5, 5);
    Ques_Title.setBackgroundColor(Color.parseColor("#FFFFFF"));
    params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
        RelativeLayout.LayoutParams.WRAP_CONTENT);
    params.removeRule(RelativeLayout.BELOW);
    params.removeRule(RelativeLayout.ALIGN_PARENT_LEFT);
    params.removeRule(RelativeLayout.ALIGN_PARENT_START);
    params.addRule(RelativeLayout.ALIGN_TOP,R.id.day_month);
    params.addRule(RelativeLayout.RIGHT_OF,R.id.day_month);
    Questions_Layout.addView(Ques_Title);
    Ques_Title.setLayoutParams(params);
    //Setting Parameters For TextViews
    //Question Description TextView "This Is Description Of The Question

    TextView Ques_Desc=new TextView(this);
    Ques_Desc.setId(R.id.ques_desc);
    Ques_Desc.setText("This Is The Description Of Question");
    Ques_Desc.setPadding(10, 10, 10, 10);
    Ques_Desc.setBackgroundColor(Color.parseColor("#FFFFFF"));
    params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
        RelativeLayout.LayoutParams.WRAP_CONTENT);
    params.removeRule(RelativeLayout.RIGHT_OF);
    params.removeRule(RelativeLayout.ALIGN_TOP);
    params.addRule(RelativeLayout.BELOW,R.id.ques_title);
    params.addRule(RelativeLayout.RIGHT_OF,R.id.day_month);
    params.addRule(RelativeLayout.END_OF,R.id.day_month);
    Questions_Layout.addView(Ques_Desc);
    Ques_Desc.setLayoutParams(params);


    RatingBar ratingBar = new RatingBar(this);
    ratingBar.setId(R.id.rating_bar);
    ratingBar.setNumStars(1);
    ratingBar.setStepSize(1);
    params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
        RelativeLayout.LayoutParams.WRAP_CONTENT);
    params.setMargins(10,0,0,0);
    params.removeRule(RelativeLayout.ALIGN_LEFT);
    params.removeRule(RelativeLayout.BELOW);
    params.removeRule(RelativeLayout.START_OF);
    params.addRule(RelativeLayout.ALIGN_LEFT,R.id.ques_desc);
    params.addRule(RelativeLayout.BELOW,R.id.ques_desc);
    params.addRule(RelativeLayout.START_OF,R.id.ques_desc);
    Questions_Layout.addView(ratingBar);
    ratingBar.setLayoutParams(params);


    //Setting Parameters For TextViews
    //People Rated TextView "3 people Rated This"

    TextView People_Rated = new TextView(this);
    People_Rated.setId(R.id.people_rated);
    People_Rated.setText("9 People Rated This");
    People_Rated.setPadding(15, 15, 15, 15);
    People_Rated.setBackgroundColor(Color.parseColor("#FFFFFF"));
    params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
        RelativeLayout.LayoutParams.WRAP_CONTENT);
    params.removeRule(RelativeLayout.RIGHT_OF);
    params.removeRule(RelativeLayout.BELOW);
    params.addRule(RelativeLayout.BELOW,R.id.ques_desc);
    params.addRule(RelativeLayout.ALIGN_TOP,R.id.rating_bar);
    params.addRule(RelativeLayout.RIGHT_OF,R.id.rating_bar);
    Questions_Layout.addView(People_Rated);
    People_Rated.setLayoutParams(params);

     base.addView(Questions_Layout);
}

But better approach will be to use inflator. Instead of adding all layout dynamically, you can also create one xml having your custom row and can inflate it dynamically. for example, lets consider you have save your layout in a xml with the name item_layout. Now use it to dynamically add your layout. It's a more clean approach.

setContentView(R.layout.activity_main);
ViewGroup container = (ViewGroup)findViewById(R.id.question_content);

for(int i=0;i<4;i++){
     LayoutInflater inflate = LayoutInflater.from(mContext);
     ViewGroup base = (ViewGroup)inflate.inflate(R.layout.item_layout, container, false);
     
    TextView month_name = base.findViewById(R.id.month_name);
    month_name.setText("Jan 2014");
    
    TextView Day_Month = base.findViewById(R.id.day_month);
    Day_Month.setText("12 Jan");

    TextView Ques_Title = new TextView(R.id.ques_title);
    Ques_Title.setText("This Is The Title");

    TextView Ques_Desc = new TextView(R.id.ques_desc);
    Ques_Desc.setText("This Is The Description Of Question");

    RatingBar ratingBar = new RatingBar(R.id.rating_bar);
    ratingBar.setNumStars(1);

    TextView People_Rated = new TextView(R.id.day_month);
    People_Rated.setText("9 People Rated This");
    
    container.addView(base);
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Crazyrems