无法将子项添加到linearLayout

时间:2015-03-02 06:40:47

标签: android xml android-layout

在我的应用程序中,我想要的是根据数组的长度动态地将按钮添加到线性布局。例如,如果数组的长度为4,那么应该在线性布局中添加4个按钮。我试着做那但我的应用程序总是崩溃

位于xml底部的linearlayout是我想要添加按钮的地方

XML

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/bg">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/hsjobslogo"
            android:layout_gravity="center"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true" />

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/mrd_home"
            android:layout_marginRight="10dp"
            android:src="@drawable/home168"
            android:layout_centerVertical="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true" />


    </RelativeLayout>

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:background="@drawable/header"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:id="@+id/linearLayout2">

        <TextView
            android:layout_width="0dp"
            android:layout_height="33dp"
            android:layout_weight="2"
            android:layout_marginTop="04dp"
            android:text="Resource"
            android:gravity="center|start"
            android:textColor="#fff"
            android:textStyle="bold"

            android:layout_marginLeft="10dp"
            android:textSize="18sp" />

        <ImageView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.5"
            android:padding="10dp"
            android:visibility="gone"
            android:layout_marginTop="-5dp"
            android:src="@drawable/edit" />


    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.35"


        android:visibility="visible"
        android:id="@+id/ll_main_pi"
        android:orientation="vertical">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:orientation="horizontal">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Name"
                android:textStyle="bold"


                style="@style/Job_on_Call"
                android:textColor="#000"
                android:id="@+id/tv_mrd_pi_name" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text=" [ "

                style="@style/Job_on_Call"
                android:singleLine="false" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Gender"


                style="@style/Job_on_Call"
                android:textColor="#000"
                android:id="@+id/tv_mrd_gender" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text=","

                style="@style/Job_on_Call"
                android:singleLine="false" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Age"


                style="@style/Job_on_Call"
                android:textColor="#000"
                android:id="@+id/tv_mrd_age" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text=" ]"

                style="@style/Job_on_Call"
                android:singleLine="false" />

        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"

            android:layout_marginLeft="10dp"
            android:orientation="horizontal">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Profession"


                style="@style/Job_on_Call"
                android:textColor="#000"
                android:id="@+id/tv_mrd_profession" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text=" [ "

                style="@style/Job_on_Call"
                android:singleLine="false" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Yrs"


                style="@style/Job_on_Call"
                android:textColor="#000"
                android:id="@+id/tv_mrd_exp_yrs" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="."

                style="@style/Job_on_Call"
                android:singleLine="false" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Months"


                style="@style/Job_on_Call"
                android:textColor="#000"
                android:id="@+id/tv_mrd_exp_months" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text=" ]"

                style="@style/Job_on_Call"
                android:singleLine="false" />

        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:orientation="horizontal">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text=""


                style="@style/Job_on_Call"
                android:singleLine="false"
                android:layout_marginBottom="2dp"
                android:id="@+id/tv_mrd_area" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text=""


                style="@style/Job_on_Call"
                android:singleLine="false"
                android:layout_marginBottom="2dp"
                android:id="@+id/tv_mrd_city" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text=""


                style="@style/Job_on_Call"
                android:singleLine="false"
                android:layout_marginBottom="2dp"
                android:id="@+id/tv_mrd_state" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text=""

                style="@style/Job_on_Call"
                android:singleLine="true"
                android:id="@+id/tv_mrd_country" />

        </LinearLayout>


    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"


        >

        <ImageView
            android:layout_width="0dp"
            android:layout_height="1dp"
            android:gravity="bottom"
            android:layout_gravity="bottom"
            android:background="@drawable/divider_light"
            android:layout_weight="0.2" />


        <LinearLayout
            android:layout_width="0dp"
            android:layout_weight="1.6"

            android:layout_height="wrap_content"
            android:background="@drawable/rectangle">

            <TextView
                android:layout_width="0dp"
                android:layout_weight="2"
                android:layout_height="wrap_content"
                android:text="Personal Info"
                android:textStyle="bold"
                android:textSize="18sp"
                android:id="@+id/tv_mrd_header"
                style="@style/Job_on_Call"
                android:textColor="#fff"
                android:layout_marginTop="05dp"
                android:layout_marginLeft="19dp" />

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/plus_one"
                android:visibility="gone"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="5dp"
                android:id="@+id/iv_mrd_add" />

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@drawable/edit_one"
                android:visibility="visible"
                android:layout_marginRight="5dp"
                android:layout_marginLeft="10dp"
                android:id="@+id/iv_mrd_edit" />


        </LinearLayout>

    </LinearLayout>


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1.5"
        android:orientation="horizontal">

        <ImageView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.2"
            android:padding="5dp"
            android:id="@+id/iv_mrd_go_left"
            android:src="@drawable/left_arrow" />

        <ViewFlipper
            android:layout_width="0dp"
            android:layout_weight="2"
            android:layout_height="match_parent"
            android:visibility="visible"
            android:id="@+id/mrd_view_flipper"
            android:layout_gravity="center_horizontal">


            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="horizontal"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                android:layout_marginTop="2dp"
                android:id="@+id/ll_my_resource_personal_details">

                <LinearLayout
                    android:layout_width="0dp"
                    android:layout_height="match_parent"
                    android:orientation="vertical"
                    android:layout_weight="2">

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:text="Nationality"
                        android:textStyle="bold"
                        android:id="@+id/tv_mrd_nationality_header"
                        android:layout_marginTop="02dp"
                        style="@style/Job_on_Call"
                        android:textColor="#000" />




                </LinearLayout>


            </LinearLayout>


            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical"
                android:layout_marginLeft="10dp"
                android:layout_marginRight="10dp"
                android:layout_marginTop="2dp"
                android:id="@+id/ll_my_resource_refference_details">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Name"
                    android:textStyle="bold"
                    android:id="@+id/tv_mrd_ref_name_header"
                    android:layout_marginTop="02dp"
                    style="@style/Job_on_Call"
                    android:textColor="#000" />




            </LinearLayout>

            <RelativeLayout
                android:orientation="vertical"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginLeft="10dp">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Document Type"
                    android:textStyle="bold"
                    android:id="@+id/dumm1"
                    android:layout_marginTop="05dp"
                    style="@style/Job_on_Call"
                    android:textColor="#000" />


            </RelativeLayout>

            <RelativeLayout
                android:orientation="vertical"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_margin="20dp">


                <ImageView
                    android:layout_width="200dp"
                    android:layout_height="200dp"
                    android:id="@+id/mrd_profile_pic"
                    android:layout_margin="10dp"
                    android:layout_centerVertical="true"
                    android:layout_centerHorizontal="true" />


            </RelativeLayout>


        </ViewFlipper>

        <ImageView
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.2"
            android:padding="5dp"
            android:id="@+id/iv_mrd_go_right"
            android:src="@drawable/right_arrow" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="0.2"
        android:layout_gravity="center"
        android:gravity="center"
        android:id="@+id/add_doc_circles"
        android:orientation="horizontal">


    The layout where i want to create buttons dynamically


    </LinearLayout>


</LinearLayout> 

代码

if (NewDataSet.get("Table2") instanceof JSONArray) {
                                isDocPresent = true;
                                JSONArray array = NewDataSet.getJSONArray("Table2");
                                numOfDocCircles = array.length();
                                LayoutInflater layoutInflater;
                                Button button = new Button(context);
                                for (int k = 0; k < array.length(); k++) {
                                    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(30, 30);
                                    button.setLayoutParams(params);
                                    button.setText("" + k);
                                    llAddDocCircles.addView(button);
                                }

错误

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

请帮我解决这个问题?

2 个答案:

答案 0 :(得分:1)

将您的按钮创建移动到for循环中,在您的代码中,您基本上只是将相同的Button实例添加到父布局中几次:

for (int k = 0; k < array.length(); k++) {
    Button button = new Button(context);
    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(convertDpToPixel(30), convertDpToPixel(30));
    button.setLayoutParams(params);
    button.setText("" + k);
    llAddDocCircles.addView(button);
}

使用以下方法将dp转换为pixel

public static float convertDpToPixel(float dp){
    Resources resources = context.getResources();
    DisplayMetrics metrics = resources.getDisplayMetrics();
    float px = dp * (metrics.densityDpi / 160f);
    return px;
}

答案 1 :(得分:1)

在for循环中调用此方法为:

for (int k = 0; k < array.length(); k++) {
    llAddDocCircles.addView(addMoreButton("" + k));
}

您的addMoreButton()方法是:

public Button addMoreButton(String text) {

    Button button = new Button(context);
    button.setId(buttonID);
    LinearLayout.LayoutParams buttonLayoutParams = new LinearLayout.LayoutParams(
            LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);  
    button LayoutParams.setMargins(10, 10, 10, 10); //Add this if you want margin of 10dp 
    button.setLayoutParams(buttonLayoutParams );
    buttonArrayList.add(button);
    buttonID++;
    return button;
}

您可以通过以下方式轻松访问这些按钮值:

private static int buttonID = 0;
private ArrayList<Button> buttonArrayList= new ArrayList<Button>();

// loop to handle each button 
for (int i = 0; i < buttonArrayList.size(); i++) {
    Button button = buttonArrayList.get(i);
            // do your stuff with each button
    button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

        }
    });
}