'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 |
