2012-07-18 18 views
8

Tengo un problema relacionado con inflar y volver a utilizar el mismo TextView.
Es como si tratara de sobrescribir la misma vista de texto una y otra vez o algo así y no puede hacer eso?Usar ver para inflar varias veces

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

Aquí es el 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" /> 

Ésta es la im error al obtener y está en fila: 51, que es: 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) 

Respuesta

16

Nunca agregará ninguna vista a su actividad. Está creando nuevas TableRows y agregando TextViews a ellas, pero nunca agregará las filas a nada. Asumiendo que tiene un TableLayout en R.layout.days_monday_inflate, debe obtener primero una referencia a ese punto de vista (TableLayout layout = (TableLayout)mainLayout.findViewById(R.id.my_table_layout_id)) y luego añadir cada fila para que 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); 
} 

Aunque yo recomendaría la creación de su diseño totalmente en XML en todo caso posible, a menos que sea necesario dinámicamente. Además, si solo está agregando un TextView por fila, es mejor que solo use LinearLayout, sugeriría.

+0

¡Muchas gracias! He estado sentado con esto durante aproximadamente 2 horas, abit noobish. Pero ahora puedo continuar desarrollando mi aplicación, ¡increíble! – JussT

+2

Una cosa a tener en cuenta es que debe pasar ese nulo cuando se infla, porque si intenta adjuntarlo a un grupo de vista, inflate() devolverá el grupo de vista y su findViewById aún devolverá la primera instancia del id. No el uno nuevo. – MikeHelland

+4

@mikethematrix En realidad, ahora me doy cuenta de que pasar nulo es el enfoque equivocado.De hecho, debe pasar el diseño principal en, pero también pasar 'falso' como el último parámetro para evitar adjuntarlo al diseño de inmediato (lo que le permite obtener una referencia). He actualizado la respuesta. – kcoppock

0

Usted está tratando de añadir una sola TextView en varias filas, que es lo que está causando su error. Tendrá que reinflar el layout_number cada vez para obtener un nuevo TextView.

No estoy seguro de lo que está contenido dentro de su archivo layout_number, pero sobre la base de lo que tenemos aquí, parece que podría ser mejor servido para crear nuevos TextViews dentro de su bucle 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

consigo el mismo error si estoy usando 'number = new TextView (this);' Y el error está en la fila 50 ahora que es 'number.setText (Integer.toString (i));' – JussT

0

Prueba esto :

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

Ahora no consigo ningún error pero no se muestra nada en el pantalla, ¿es porque no estoy apuntando a TableLayout en mi 'R.layout.days_monday_inflate'? – JussT

+0

Me preguntaba sobre esto, pensé que había dejado algún código. Necesita agregar sus instancias de TableRow a TableLayout. p.ej. TableLayout tableLayout = new TableLayout (esto); ... tableLayout.addView (fila); <- agregue la fila de la tabla. – azgolfer

+0

¿Debo hacer esto en cada círculo for-loop o después de for-loop? Como tengo un TableLayout en mi days_monday_inflate, quiero usar – JussT

2

En mi caso, setTag (i) no funcionaba, lo que funcionó fue cambiando el id después de inflar el diseño, pero antes de añadir a la vista padre como esto:

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