在Android中动态生成相对布局

时间:2015-01-05 05:35:11

标签: android relativelayout

我想知道如何为我的应用程序动态生成相对布局。我想为从服务器获得的每个项目生成一个新的相对布局。

我想生成的XML视图如下:

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

    

我尝试在java代码中执行此操作:我想在android中创建布局:id =“@ + id / question_content”动态

    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);

但它不起作用。难道我做错了什么。请提出建议

1 个答案:

答案 0 :(得分:0)

的setContentView(R.layout.activity_main);应该在LinearLayout base =(LinearLayout)之前的findViewById(R.id.question_content);否则base将返回值为null。

还有一些问题,每次添加时都会创建params对象,你在for循环中创建Questions_Layout视图。它应该在for循环和base.addView(Questions_Layout)中;也应该在for循环中。请检查更正后的答案。

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);
}

但更好的方法将使用充气机。您可以创建一个包含自定义行的xml,而不是动态添加所有布局,而不是动态添加所有布局。例如,我们假设您已将布局保存在名为item_layout的xml中。现在用它来动态添加你的布局。这是一种更干净的方法。

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);
}