2012-07-18 3 views
8

동일한 TextView를 팽창시키고 재사용하는 것과 관련된 몇 가지 문제점이 있습니다.
그것도 같은 textview를 반복적으로 덮어 쓰려고 노력하는 것과 마찬가지입니다. 여기 보기를 사용하여 여러 번 풍선을 사용하십시오

LayoutInflater inflater = LayoutInflater.from(this); 
View mainlayout = inflater.inflate(R.layout.days_monday_inflate, null); 
View layout_number = inflater.inflate(R.layout.inflate_number, null); 

for (int i = 0; i < 10; i++) { 
    row = new TableRow(this); 
    number = (TextView) layout_number.findViewById(R.id.Number); 
    number.setTag(i); 
    number.setText(Integer.toString(i)); 
    row.addView(number); 
} 
setContentView(mainlayout); 

는 inflate_number.xml

<TextView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/Number" 
    android:layout_width="3dp" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center|bottom" 
    android:text="1" /> 

이 점점 오류 메신저입니다 및 해당 행에 : 51입니다 : 당신은 하나를 추가하려는 row.addView(number);

07-18 20:54:25.124: E/AndroidRuntime(1166): Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 07-18 20:54:25.124: E/AndroidRuntime(1166): at android.view.ViewGroup.addViewInner(ViewGroup.java:1970) 07-18 20:54:25.124: E/AndroidRuntime(1166): at android.view.ViewGroup.addView(ViewGroup.java:1865) 07-18 20:54:25.124: E/AndroidRuntime(1166): at android.view.ViewGroup.addView(ViewGroup.java:1822) 07-18 20:54:25.124: E/AndroidRuntime(1166): at android.view.ViewGroup.addView(ViewGroup.java:1802) 07-18 20:54:25.124: E/AndroidRuntime(1166): at com.trainingschedule.days.Monday.onCreate(Monday.java:50) 07-18 20:54:25.124: E/AndroidRuntime(1166): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 07-18 20:54:25.124: E/AndroidRuntime(1166): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 

답변

16

실제로 활동에보기를 추가 한 적이 없습니다. 새 TableRow를 만들고 TextViews를 추가하고 있지만 행을 아무 것도 추가하지는 않습니다. 당신이 R.layout.days_monday_inflate에서 TableLayout을 가지고 가정하면, 먼저 해당보기로 (TableLayout layout = (TableLayout)mainLayout.findViewById(R.id.my_table_layout_id)를) 참조를 얻고 그 TableLayout을 각 행을 추가한다 : 나는 모든 경우에 XML 완전히 레이아웃을 설정하는 것이 좋습니다 있지만

TableLayout layout = (TableLayout)mainLayout.findViewById(R.id.my_table_layout_id); 

for(int i = 0; i < 10; i++) { 
    row = new TableRow(this); 
    View layout_number = inflater.inflate(R.layout.inflate_number, layout, false); 
    TextView number = (TextView) layout_number.findViewById(R.id.Number); 
    number.setTag(i); 
    number.setText(Integer.toString(i)); 
    row.addView(number); 
    layout.addView(row); 
} 

가능하다. 또한 행당 하나의 TextView 만 추가하는 경우 LinearLayout을 사용하는 것이 좋습니다. 내 경우

+0

고마워요! 지금 약 2 시간 동안 이것과 함께 앉아 있었 더라면, abob noobish. 하지만 이제는 내 응용 프로그램 개발을 계속할 수 있습니다. – JussT

+2

팽창 할 때 그 null을 전달해야한다는 점에 주목해야합니다. 뷰 그룹에 첨부하려고하면 inflate()가 뷰 그룹을 반환하고 findViewById가 여전히 ID의 첫 번째 인스턴스를 반환하기 때문에 null을 전달해야합니다. 새로운. – MikeHelland

+4

@mikethematrix 사실, 이제 null을 전달하는 것이 잘못된 접근임을 깨닫게됩니다.실제로 부모 레이아웃을 전달해야하지만, 레이아웃에 즉시 첨부하지 못하도록 마지막 매개 변수로'false'를 전달해야합니다 (참조를 얻을 수 있도록 허용). 답변을 업데이트했습니다. – kcoppock

0

TextView를 여러 행에 연결하면 오류가 발생합니다. 새로운 TextView를 얻으려면 매번 layout_number를 다시 플래닝해야합니다. 나는 당신의 layout_number 파일에 포함하지만 여기에 무엇을 기반으로 무엇 확실하지 않다

, 당신이 좋을 것 같은

for (int i = 0; i < 10; i++) { 
    row = new TableRow(this); 
    number = new TextView(this); 
    number.setTag(i); 
    number.setText(Integer.toString(i)); 
    row.addView(number); 
} 
+0

저도 같은 오류가있는 경우를 얻을 수 'number = new TextView (this);'를 사용하여 메신저 'num.setText (Integer.toString (i));' – JussT

0

람 루프 내부의 새로운 TextViews을 만들 봉사 것이 시도 :

View mainlayout = inflater.inflate(R.layout.days_monday_inflate, null); 

for (int i = 0; i < 10; i++) { 
    row = new TableRow(this); 
    View layout_number = inflater.inflate(R.layout.inflate_number, null); 
    TextView number = (TextView) layout_number.findViewById(R.id.Number); 
    number.setTag(i); 
    number.setText(Integer.toString(i)); 
    row.addView(number); 
} 
+0

인 50 행에 오류가 발생했습니다. 화면, 내 'R.layout.days_monday_inflate'에서 TableLayout을 타겟팅하지 않았기 때문입니까? – JussT

+0

나는 이것에 대해 궁금해했다. 나는 당신이 약간의 코드를 생략했다고 생각했다. TableLayout에 TableRow 인스턴스를 추가해야합니다. 예 : TableLayout tableLayout = 새로운 TableLayout (this); ... tableLayout.addView (row); <- 표 행을 추가하십시오. – azgolfer

+0

각 for-loop circle 또는 for-loop 후에이 작업을 수행해야합니까? 내 days_monday_inflate에 TableLayout이 있으므로 – JussT

2

,의 SetTag (i)는 작동하지 않았다, 레이아웃을 팽창 후 그러나이 같은 부모보기에 추가하기 전에 ID를 변경 무슨 일 :

LayoutInflater inflater = LayoutInflater.from(this); 
View mainlayout = inflater.inflate(R.layout.days_monday_inflate, null); 
View layout_number = inflater.inflate(R.layout.inflate_number, null); 

for (int i = 0; i < 10; i++) { 
    row = new TableRow(this); 
    number = (TextView) layout_number.findViewById(R.id.Number); 
    number.setId(i); //THIS IS THE KEY STEP 
    number.setText(Integer.toString(i)); 
    row.addView(number); 
} 
setContentView(mainlayout);