2012-07-18 12 views
8

Ho qualche problema riguardante il gonfiaggio e il riutilizzo dello stesso TextView.
È come se cercasse di sovrascrivere la stessa textview più e più volte o qualcosa del genere e non può farlo?Usa visualizzazione per gonfiare più volte

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

Ecco l'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" /> 

Questo è l'im errore di ottenere e la sua nel braccio: 51, che è: 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) 

risposta

16

In realtà non aggiungi mai alcuna vista alla tua attività. Stai creando nuovi TableRows e aggiungendo TextViews a loro, ma non aggiungerai mai le righe a nulla. Supponendo di aver un TableLayout in R.layout.days_monday_inflate, si deve prima ottenere un riferimento a quella vista (TableLayout layout = (TableLayout)mainLayout.findViewById(R.id.my_table_layout_id)) e quindi aggiungere ogni riga a quella 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); 
} 

Anche se mi sento di raccomandare la creazione di layout completamente in XML se non del tutto possibile, a meno che non sia necessario in modo dinamico. Inoltre, se stai aggiungendo solo una TextView per riga, è meglio usare solo un LinearLayout, suggerirei.

+0

Grazie mille! Sono stato seduto con questo per circa 2 ore ora, abit noobish. Ma ora posso continuare a sviluppare la mia applicazione, fantastico !! – JussT

+2

Una cosa da notare è che devi passare quel valore nullo quando si gonfia, perché se provi ad associarlo a un gruppo di visualizzazione, lì inflate() restituirà il gruppo di viste e il tuo findViewById restituirà comunque la prima istanza dell'ID non il nuovo. – MikeHelland

+4

@mikethematrix In realtà, ora realizzo il passaggio di null è l'approccio sbagliato.Dovresti in effetti passare il layout genitore, ma anche passare in 'false' come ultimo parametro per impedire di collegarlo immediatamente al layout (permettendoti di ottenere un riferimento ad esso). Ho aggiornato la risposta. – kcoppock

0

Stai cercando di aggiungere un singolo TextView su più righe, che è ciò che sta causando il tuo errore. Dovrai reinfilare layout_number ogni volta per ottenere un nuovo TextView.

Non sono sicuro di ciò che è contenuto all'interno del file layout_number, ma in base al largo quello che avete qui, sembra che potrebbe essere meglio servita per creare nuovi TextViews all'interno del vostro ciclo 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

ottengo lo stesso errore se im usando 'number = new TextView (this);' E l'errore è sulla riga 50 ora che è 'number.setText (Integer.toString (i));' – JussT

0

Prova questo :

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

Ora non ho alcun errore ma, nulla viene mostrato sul schermo, perché non sto prendendo di mira il TableLayout nel mio 'R.layout.days_monday_inflate'? – JussT

+0

Mi stavo chiedendo, pensavo che avessi lasciato un po 'di codice. È necessario aggiungere le istanze TableRow a un TableLayout. per esempio. TableLayout tableLayout = new TableLayout (this); ... tableLayout.addView (riga); <- aggiungi la riga della tabella. – azgolfer

+0

Devo eseguire questa operazione su ciascun ciclo for-loop o dopo il ciclo for? Perché ho un TableLayout nel mio days_monday_inflate Voglio usare – JussT

2

Nel mio caso, setTag (i) non ha funzionato, cosa ha funzionato stava cambiando l'id dopo aver gonfiato il layout, ma prima di aggiungerlo alla vista primaria in questo modo:

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