Java 向线性布局添加视图

Java 向线性布局添加视图,java,android,xml,android-layout,Java,Android,Xml,Android Layout,我有垂直滚动视图,我将在按钮点击后添加一些视图。下面是滚动视图的xml <ScrollView android:background = "@drawable/border" android:layout_weight="31" android:id="@+id/scrollView1" android:layout_width="match_parent" android:layout_height="0dp" > <Line

我有垂直滚动视图,我将在按钮点击后添加一些视图。下面是滚动视图的xml

<ScrollView
    android:background = "@drawable/border"
    android:layout_weight="31"
    android:id="@+id/scrollView1"
    android:layout_width="match_parent"
    android:layout_height="0dp" >

    <LinearLayout
        android:id="@+id/layoutScroll"
        android:padding = "10dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >






        <LinearLayout
            android:id="@+id/layoutContainer"
            android:padding="5dp"
            android:orientation="vertical"
            android:background="@drawable/border_2"
            android:layout_width="fill_parent"
            android:layout_height = "wrap_content">

            <RelativeLayout
                android:id="@+id/relativeLayout"
                android:layout_height = "wrap_content"
                android:layout_width = "fill_parent">
                <TextView
                    android:id="@+id/textWord"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="@string/word"
                    android:textAppearance="?android:attr/textAppearanceMedium" />

                <TextView
                    android:id="@+id/textNumber"
                    android:background = "@drawable/border_1"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentRight="true"
                    android:layout_alignParentTop="true"
                    android:text=" 1 "
                    android:textAppearance="?android:attr/textAppearanceMedium" />

            </RelativeLayout>

            <EditText 
                android:id="@+id/editWord"
                android:layout_marginTop="3dp"
                android:layout_gravity="left"
                android:inputType="text"
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:lines="1"
                android:scrollbars="horizontal"/>
            <TextView 
                android:id="@+id/textDefinition"
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:text = "@string/definition" />
            <EditText 
                android:id="@+id/editDefinition"
                android:gravity="top|left"
                android:inputType="textMultiLine"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:lines="3"
                android:maxLines="3"
                android:scrollbars="vertical"/>               
        </LinearLayout>
        <TextView
            android:id="@+id/textEmpty"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:lines="1"
            android:textAppearance="?android:attr/textAppearanceMedium" />





    </LinearLayout>
</ScrollView>
然后我像这样将它们添加到布局中

public void onCLick_Add(View v){
    layoutScroll.addView(layoutContainer);
    layoutScroll.addView(textEmpty);

}
问题是它只工作一次。当我第二次单击按钮时,应用程序崩溃。
提前感谢。

出现问题的原因是
滚动视图只能在子视图上显示。换句话说,
ScrollView
可以有
LinearLayout
RelativeLayout
TextView
等。更新您的代码,以便在
LinearLayout
内添加新的视图(layoutScroll),而不是
ScrollView
您的日志显示:

Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
在多次单击时,您试图多次添加相同的layoutContainer和textEmpty。此操作失败,因为它们已被添加,因此已具有父级。(不能将同一视图添加到多个父视图)

解决方案 我猜您希望在每次按下按钮时创建一个新视图,并将其添加到布局滚动中。每次单击都应再次调用init方法:

public void onCLick_Add(View v){
  initInterface();
  layoutScroll.addView(layoutContainer);
  layoutScroll.addView(textEmpty);
}
我还建议将initInterface()划分为:

确保将scrollView的初始化放在外部(例如onCreate),并在createLayoutContainer()中声明类似于layoutContainer localy的视图,而不是全局视图

下面是它的外观片段:

private View createLayoutContainer(){
  LinearLayout layoutContainer = new LinearLayout(getApplicationContext());
  RelativeLayout relativeLayout = new RelativeLayout(getApplicationContext());

  TextView textWord = new TextView(getApplicationContext());
  ...
  return layoutContainer;
}

public void onCLick_Add(View v){
  layoutScroll.addView(createLayoutContainer());
  layoutScroll.addView(createTextEmptyView());
}

正如我在评论中指出的,错误是这样的:
,原因是:java.lang.IllegalStateException:指定的子级已经有了父级。必须首先对孩子的家长调用removeView()。

这类错误的清单

正如这篇文章所指出的

仔细检查所有addView调用

  • 确保不再添加任何视图一次。当视图准备就绪时 已使用(例如,您使用findViewById获取它,不要在其上使用addView

  • 如果要添加视图,请将addView与新视图一起使用。您可以添加 这些新视图中的几个视图被添加到一个视图中,但不能添加该视图 查看多次

  • 您不能仅仅通过更改某些视图来重用视图 你可以重复使用一个变量,但是如果需要,你需要创建一个新的视图 您想使用addView重新添加它


日志猫说了什么?我无法从日志中理解任何有用的东西。我已经保存了它。您可以在这里查看您的CreateSetActivity.javasetting文本中的第164行是什么,用于全局TexView对象
textNumber.setText(“+wordCounter+”);
我注释掉了该行,但它仍在崩溃
private View createLayoutContainer();
private View createTextEmpty();
private View createLayoutContainer(){
  LinearLayout layoutContainer = new LinearLayout(getApplicationContext());
  RelativeLayout relativeLayout = new RelativeLayout(getApplicationContext());

  TextView textWord = new TextView(getApplicationContext());
  ...
  return layoutContainer;
}

public void onCLick_Add(View v){
  layoutScroll.addView(createLayoutContainer());
  layoutScroll.addView(createTextEmptyView());
}