2012-07-18 8 views
8

Ich habe ein Problem in Bezug auf das Aufblasen und die Wiederverwendung der gleichen TextView.
Es ist wie es versucht, die gleiche Textansicht immer wieder zu überschreiben oder etwas und es kann nicht tun? HierVerwenden Sie Ansicht, um mehrmals aufzublasen

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

ist die 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" /> 

Dies ist der Fehler im bekommen und seine auf der Reihe: 51, die ist: 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) 

Antwort

16

Sie fügen Ihrer Aktivität eigentlich keine Ansichten hinzu. Sie erstellen neue TableRows und fügen ihnen TextViews hinzu, aber Sie fügen die Zeilen nie zu etwas hinzu. Angenommen, Sie haben ein Tablelayout in R.layout.days_monday_inflate, sollten Sie zunächst einen Verweis auf diese Ansicht (TableLayout layout = (TableLayout)mainLayout.findViewById(R.id.my_table_layout_id)) und dann jede Zeile hinzufügen zu diesem Tablelayout:

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); 
} 

Obwohl ich empfehlen würde, das Layout vollständig in XML einrichten, wenn überhaupt möglich, sofern nicht dynamisch benötigt. Wenn Sie nur einen TextView pro Zeile hinzufügen, ist es besser, nur ein LinearLayout zu verwenden, würde ich vorschlagen.

+0

Vielen Dank! Habe jetzt seit ungefähr 2 Stunden damit gesessen, abit noobish. Aber jetzt kann ich mich weiter entwickeln, super !! – JussT

+2

Eine Sache zu beachten ist, dass Sie diese Null übergeben müssen, wenn Sie aufblasen, denn wenn Sie versuchen, es an eine Ansichtsgruppe anzuhängen, gibt inflate() die Ansichtsgruppe zurück und Ihre findViewById gibt immer noch die erste Instanz der ID zurück ein neues. – MikeHelland

+4

@mikethematrix Eigentlich ist mir jetzt klar, dass das Überschreiten von Null der falsche Ansatz ist.Sie sollten das übergeordnete Layout tatsächlich übergeben, aber auch "false" als letzten Parameter übergeben, um zu verhindern, dass es sofort an das Layout angehängt wird (damit Sie einen Verweis darauf erhalten). Ich habe die Antwort aktualisiert. – kcoppock

0

Sie versuchen, eine einzelne hinzufügen TextView zu mehreren Zeilen, was Ihren Fehler verursacht. Sie müssen layout_number jedes Mal neu aufladen, um eine neue TextView zu erhalten.

Ich bin nicht sicher, was in Ihrer layout_number-Datei enthalten ist, basiert aber vor, was Sie hier haben, so scheint es, wie Sie besser sein könnten neuen Textviews innerhalb der Schleife ala

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

Ich bekomme die gleichen Fehler, wenn Ich benutze 'number = new TextView (this);' Und der Fehler ist in Zeile 50 jetzt das ist 'number.setText (Integer.toString (i)); ' – JussT

0

dies zu schaffen serviert Versuchen :

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

Jetzt bekomme ich keine Fehler, aber nichts zeigt auf der Bildschirm, ist es, weil ich das TableLayout in meinem 'R.layout.days_monday_inflate' nicht ziele? – JussT

+0

Ich wunderte mich darüber, ich dachte, du hättest einen Code weggelassen. Sie müssen Ihre TableRow-Instanzen zu einem TableLayout hinzufügen. z.B. TableLayout tableLayout = new TableLayout (this); ... tableLayout.addView (Zeile); <- füge die Tabellenzeile hinzu. – azgolfer

+0

Muss ich dies für jeden For-Loop-Kreis oder nach meiner For-Schleife tun? Da ich ein TableLayout in meinem days_monday_inflate habe, möchte ich – JussT

2

In meinem Fall setTag (i) funktioniert nicht, was gearbeitet wurde die ID zu ändern, nachdem das Layout Aufblasen aber bevor es zu der übergeordneten Ansicht wie folgt ergänzt:

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); 
Verwandte Themen