2014-01-18 4 views
0

ButtonClick 후에 뷰를 추가 할 세로 ScrollView가 있습니다. 저는 여기있는 LinearLayoutLinearLayout에 뷰 추가하기

private void initInterface(){ 
    layoutScroll = (LinearLayout) findViewById (R.id.layoutScroll); 
    layoutContainer = new LinearLayout(getApplicationContext()); 
    relativeLayout = new RelativeLayout(getApplicationContext()); 

    textWord = new TextView(getApplicationContext()); 
    textDefinition= new TextView(getApplicationContext()); 
    textNumber = new TextView(getApplicationContext()); 
    textEmpty = new TextView(getApplicationContext()); 

    editWord = new EditText(getApplicationContext()); 
    editDefinition = new EditText(getApplicationContext()); 


    layoutContainer.setPadding(5, 5, 5, 5); 
    layoutContainer.setOrientation(LinearLayout.VERTICAL); 
    layoutContainer.setBackgroundResource(R.drawable.border_2); 
    LinearLayout.LayoutParams param1 = 
      new LayoutParams(LayoutParams.MATCH_PARENT , LayoutParams.WRAP_CONTENT); 
    layoutContainer.setLayoutParams(param1); 


    RelativeLayout.LayoutParams param2 = 
      new RelativeLayout.LayoutParams (RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
    relativeLayout.setLayoutParams(param2); 
    textWord.setLayoutParams(param2); 
    textWord.setTextAppearance(this,android.R.style.TextAppearance_Medium); 
    textWord.setText("Word:"); 

    RelativeLayout.LayoutParams param3= 
      new RelativeLayout.LayoutParams 
      (RelativeLayout.LayoutParams.WRAP_CONTENT, 
        RelativeLayout.LayoutParams.WRAP_CONTENT); 
    param3.addRule(RelativeLayout.ALIGN_PARENT_TOP); 
    param3.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
    textNumber.setBackgroundResource(R.drawable.border_1); 
    textNumber.setTextAppearance(this,android.R.style.TextAppearance_Medium); 
    textNumber.setLayoutParams(param3); 

    relativeLayout.addView(textWord); 
    relativeLayout.addView(textNumber); 


    LinearLayout.LayoutParams param4 = param1; 
    param4.setMargins(0, 3, 0, 0); 
    editWord.setGravity(Gravity.LEFT); 
    editWord.setTextAppearance(this,android.R.style.TextAppearance_Medium); 
    editWord.setLines(1); 
    editWord.setHorizontallyScrolling(true); 
    editWord.setLayoutParams(param4); 


    textDefinition.setLayoutParams(param1); 
    textDefinition.setTextAppearance(this,android.R.style.TextAppearance_Medium); 
    textDefinition.setText("Definition:"); 

    editDefinition.setGravity(Gravity.TOP | Gravity.LEFT); 
    editDefinition.setSingleLine(false); 
    editDefinition.setLayoutParams(param1); 
    editDefinition.setMaxLines(3); 
    editDefinition.setLines(3); 
    editDefinition.setVerticalScrollBarEnabled(true); 
    editDefinition.setImeOptions(EditorInfo.IME_FLAG_NO_ENTER_ACTION); 

    textEmpty.setTextAppearance(this,android.R.style.TextAppearance_Medium); 
    textEmpty.setLines(1); 
    textEmpty.setLayoutParams(param1); 

    layoutContainer.addView(relativeLayout); 
    layoutContainer.addView(editWord); 
    layoutContainer.addView(textDefinition); 
    layoutContainer.addView(editDefinition); 




} 

을에 추가 동일한 개체를 만들고 나서이 같은 레이아웃에 추가이 기능에서 스크롤 뷰

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

의 XML입니다.

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

} 

문제는 한 번만 해결된다는 것입니다. 두 번째로 버튼을 클릭하면 앱이 다운됩니다. 미리 감사드립니다.

+0

logcat은 무엇을 말하고 있습니까? – droidx

+1

로그에서 유용한 정보를 찾을 수 없습니다. 저장 한 내용을 여기에 저장합니다 https://drive.google.com/file/d/0Bw1rxewzORCqazl5TEtqeUFCcjg/edit?usp=sharing – user3199577

+0

CreateSetActivity.java의 행 번호 164는 무엇입니까? – droidx

답변

1

로그는 말한다 : 당신은 여러 번 클릭 할 때 같은 layoutContainer의 및 textEmpty 여러 번 추가하려고

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

. 이것은 이미 추가 되었기 때문에 실패하므로 이미 부모가 있습니다.

솔루션 난 당신이 버튼을 누를 때와 layoutScroll이를 추가 할 때마다 새로운보기를 만들 생각 (당신은 두 개 이상의 부모에게 동일한보기를 추가 할 수 없습니다).

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

것은 나 또한 (initInterface를 분할하는 것이 좋습니다 것)에 : 당신은 모든 클릭에 대해 다시 초기화 메소드를 호출해야 당신이있는 ScrollView의 초기화를 가지고 있는지 확인

private View createLayoutContainer(); 
private View createTextEmpty(); 

외부 (예에서 onCreate) 및 createLayoutContainer()에서 전역으로가 아니라 layoutContainer localy와 같은 뷰를 선언합니다. 여기

이 어떻게 보일지 코드 조각이 : 버그의 이러한 종류의 Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

검사 목록 : 내가 코멘트에서 지적

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()); 
} 
+0

유익한 답변 주셔서 대단히 감사합니다. – user3199577

0

ScrollView은 하위보기에서만 가질 수 있기 때문에 문제가 발생합니다. 즉, ScrollView 대신 ScrollView의 새로운 뷰가 내부 (layoutScroll) LinearLayout 내부에 추가되도록 코드를 업데이트 LinearLayout 또는 RelativeLayout 또는 TextView 등을 할 수 있습니다.

0

, 버그이있다.

로 더블 the specified child already has a parent

의 모든 addView 통화를 확인이 게시물에 지적했다.

  • 보기를 한 번 이상 추가하지 않도록주의하십시오. 보기가 모두 이미 인 경우 (예 : findViewById로 가져온 경우) 추가보기를 사용하지 마십시오.

  • 보기를 추가하려면 addView를 새보기로 사용하십시오. 개의 새보기 중 하나를 하나의보기에 추가 할 수 있지만 그 중 하나를 여러 번 볼 수는 없습니다 ( ).

  • 항목을 변경하기 만하면보기를 다시 사용할 수 없습니다. 변수를 다시 사용할 수 있지만 인 경우 addView를 사용하여 다시 추가하려는 경우 새보기를 만들어야합니다.

관련 문제