5

对于以下情况,我遇到了错误specified child already has a parent. You must call removeView() on the child's parent first,看看您是否可以提供任何帮助!谢谢!

ScrollView4 个TableLayout,例如 ex_1_list、ex_2_list 等。有 4 种组,我想向各自的数据库显示不同类别的数据TableLayout,但如果数据库是空白的,那么它可以在 4 个表格布局中的每一个中膨胀一个视图,显示每个类别中没有数据。

首先获取数据库大小,如果size=0,表示练习数据库中没有数据,会进入else循环,如下:

MainActivity 类

    int i = exercises.size();   
    for (int j = 0; j < i; j++) 
    {
        Inflate_All_Ex_Data(j);
    }       
    if (i==0)
    {
        Inflate_All_Ex_Data (0);
    }

private void Inflate_All_Ex_Data (int index) 
{   
    ...
    else
    {
        LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View newTagView = inflater.inflate(R.layout.exercises_info, null);

        Button exercise_id = (Button) newTagView.findViewById(R.id.exercise_id);
        Button exercise_group = (Button) newTagView.findViewById(R.id.exercise_group);
        Button exercise_name = (Button) newTagView.findViewById(R.id.exercise_name);
        Button exercise_count = (Button) newTagView.findViewById(R.id.exercise_count);

        exercise_group.setText("");
        exercise_id.setText("");
        exercise_name.setText("No data!");
        exercise_calory.setText("");            

        table_list.removeAllViews();

        ex_1_List.addView(newTagView, index);
        ex_2_List.addView(newTagView, index); //Line224
        ex_3_List.addView(newTagView, index);
        ex_4_List.addView(newTagView, index);
    }   

xml文件:

    <ScrollView
        android:id="@+id/ScrollView01"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/Table2"
        android:layout_below="@+id/view1" >

        <LinearLayout
            android:id="@+id/table_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_alignParentBottom="true"
            android:layout_alignParentLeft="true"
            android:layout_below="@+id/add"
            android:layout_margin="2dp"
            android:orientation="vertical" >

            <TableLayout
                android:id="@+id/ex_1_List"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="5dp"
                android:layout_marginLeft="5dp"
                android:layout_marginRight="5dp"
                android:background="@drawable/blue_btn" />

            <TableLayout
                android:id="@+id/ex_2s_List"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="5dp"
                android:layout_marginLeft="5dp"
                android:layout_marginRight="5dp"
                android:background="@drawable/green_btn" />

            <TableLayout
                android:id="@+id/ex_3_List"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="5dp"
                android:layout_marginLeft="5dp"
                android:layout_marginRight="5dp"
                android:background="@drawable/yellow_btn" />

            <TableLayout
                android:id="@+id/ex_4_List"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginBottom="5dp"
                android:layout_marginLeft="5dp"
                android:layout_marginRight="5dp"
                android:background="@drawable/pink_btn" />

        </LinearLayout>
    </ScrollView>

日志猫:

07-16 01:48:44.503: E/AndroidRuntime(13094): FATAL EXCEPTION: main
07-16 01:48:44.503: E/AndroidRuntime(13094): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.examples.abc/com.example.abc.Exercises_MainActivity}: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
07-16 01:48:44.503: E/AndroidRuntime(13094):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)
07-16 01:48:44.503: E/AndroidRuntime(13094):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
07-16 01:48:44.503: E/AndroidRuntime(13094):    at android.app.ActivityThread.access$700(ActivityThread.java:140)
07-16 01:48:44.503: E/AndroidRuntime(13094):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
07-16 01:48:44.503: E/AndroidRuntime(13094):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-16 01:48:44.503: E/AndroidRuntime(13094):    at android.os.Looper.loop(Looper.java:137)
07-16 01:48:44.503: E/AndroidRuntime(13094):    at android.app.ActivityThread.main(ActivityThread.java:4921)
07-16 01:48:44.503: E/AndroidRuntime(13094):    at java.lang.reflect.Method.invokeNative(Native Method)
07-16 01:48:44.503: E/AndroidRuntime(13094):    at java.lang.reflect.Method.invoke(Method.java:511)
07-16 01:48:44.503: E/AndroidRuntime(13094):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
07-16 01:48:44.503: E/AndroidRuntime(13094):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
07-16 01:48:44.503: E/AndroidRuntime(13094):    at dalvik.system.NativeStart.main(Native Method)
07-16 01:48:44.503: E/AndroidRuntime(13094): Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
07-16 01:48:44.503: E/AndroidRuntime(13094):    at android.view.ViewGroup.addViewInner(ViewGroup.java:3620)
07-16 01:48:44.503: E/AndroidRuntime(13094):    at android.view.ViewGroup.addView(ViewGroup.java:3491)
07-16 01:48:44.503: E/AndroidRuntime(13094):    at android.widget.TableLayout.addView(TableLayout.java:425)
07-16 01:48:44.503: E/AndroidRuntime(13094):    at android.view.ViewGroup.addView(ViewGroup.java:3436)
07-16 01:48:44.503: E/AndroidRuntime(13094):    at android.widget.TableLayout.addView(TableLayout.java:407)
07-16 01:48:44.503: E/AndroidRuntime(13094):    at com.examples.abc.Exercises_MainActivity.Inflate_All_Ex_Data(Exercises_MainActivity.java:224)
07-16 01:48:44.503: E/AndroidRuntime(13094):    at com. examples.abc.Exercises_MainActivity.onCreate(Exercises_MainActivity.java:144)
07-16 01:48:44.503: E/AndroidRuntime(13094):    at android.app.Activity.performCreate(Activity.java:5206)
07-16 01:48:44.503: E/AndroidRuntime(13094):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
07-16 01:48:44.503: E/AndroidRuntime(13094):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)
07-16 01:48:44.503: E/AndroidRuntime(13094):    ... 11 more

问题:

这怎么可能specified child already has a parent. You must call removeView() on the child's parent first解决?

谢谢!

4

1 回答 1

6

您正在尝试将相同的视图添加到不同的父级。每次要将同一视图添加到不同的父级时,都必须对其进行膨胀。

我可以建议你做一个以四个为限制的 for 循环(你知道你只有四个 tableLayouts),每次都膨胀同一个视图,最后将该视图添加到 TableLayout。

for(int i=0;i<4;i++){

LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View newTagView = inflater.inflate(R.layout.exercises_info, null);
...

currentTableLayout.addView(newTagView);
//In this last line you must figure it out how to know what tableLayout corresponds
//to the i index, maybe with the name ¿?

}
于 2013-07-15T18:51:52.530 回答