2012-08-15 16 views
22

He golpeado esto desde varios ángulos diferentes. Básicamente, la esencia es esta:android: LayoutParams for TextView hace desaparecer la vista, programáticamente

He presentado una plantilla en XML para una interfaz que NECESITA ejecutar programáticamente, por lo que se completará dinámicamente durante la ejecución.

El problema aquí, es que XML TextView tiene bastantes ajustes de diseño (que funcionan) y son necesarios. Pero si realmente los configuro en código, el TextView ni siquiera aparece.

(La TextView, por cierto, está anidado dentro de un TableRow, por tanto, la llamada a peso.) La plantilla XML he diseñado en primer lugar, para utilizar como referencia para el código es esto, y funciona muy bien:

<TextView 
    android:id="@+id/txtviewWhiteBox" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="1.0" 
    android:background="@drawable/textview_9patch_white" 
    android:gravity="center" 
    android:text="75" 
    android:textColor="@android:color/black" 
    android:layout_margin="20dp" 
    android:padding="20dp" 
    android:textSize="40dp" /> 

Como dije, eso se explica perfectamente. Sin embargo, cuando ejecuto el mismo diseño en código y aplico LayoutParams, TextView desaparece.

He aquí el fragmento relevante:

int textViewExampleID = 9001; 

private TextView txtviewExample = new TextView(this); 

private void buildTextView(){ 
    LayoutParams paramsExample = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT,1.0f); 
    txtviewExample.setId(textViewExampleID); 
    txtviewExample.setBackgroundResource(R.drawable.textview_9patch_white); 
    txtviewExample.setGravity(Gravity.CENTER); 
    txtviewExample.setTextColor(getResources().getColor(android.R.color.black)); 
    paramsExample.setMargins(20, 20, 20, 20); 
    txtviewExample.setPadding(20, 20, 20, 20); 
    txtviewExample.setTextSize(40); 
    txtviewExample.setText("customExample"); 

    //if I comment out the following line, this TextView displays. 
    //if I leave it in, it doesn't display. 
    txtviewExample.setLayoutParams(paramsExample); 
} 

Soy consciente de que hay todo tipo de clases disponibles para LayoutParams, y he estado jugando con ellos todos LinearLayout.LayoutParams, TableView.LayoutParams, RelativeLayout.LayoutParams, LayoutParams solo por sí mismo ... No importa cuál intente, cualquier intento de invocar "setLayoutParams" hace que todo TextView desaparezca. He recorrido los foros aquí y todavía no he encontrado la respuesta. Esto no puede ser ESO poco común.

+4

Ha intentado 'TableRow.LayoutParams' http://developer.android.com/reference/android/widget/TableRow.LayoutParams.html –

+1

SOLO lo hice, (perdido este comentar anoche, maldición) y funcionó. Gracias hombre – Octoth0rpe

+0

De nada :) –

Respuesta

84

, que era doloroso, pero finalmente lo tengo planeado. Lo más importante para recordar (que acabo de darme cuenta) es que de todas las miríadas de LayoutParams, debe usar la que se relaciona con el PADRE de la vista en la que está trabajando, no la vista real.

Así que en mi caso, estaba tratando de obtener los márgenes TextView trabajando, pero se estaba poniendo dentro de un TableRow. El un simple cambio era asegurar que el tipo de LayoutParams siendo utilizado fueron los de TableRow:

private void buildTextView(){ 
    // the following change is what fixed it 
    TableRow.LayoutParams paramsExample = new TableRow.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT,1.0f); 
    txtviewExample.setId(textViewExampleID); 
    txtviewExample.setBackgroundResource(R.drawable.textview_9patch_white); 
    txtviewExample.setGravity(Gravity.CENTER); 
    txtviewExample.setTextColor(getResources().getColor(android.R.color.black)); 
    paramsExample.setMargins(20, 20, 20, 20); 
    txtviewExample.setPadding(20, 20, 20, 20); 
    txtviewExample.setTextSize(40); 
    txtviewExample.setText("customExample"); 
    txtviewExample.setLayoutParams(paramsExample); 
} 

Gracias chicos, espero que esto será muy útil para alguien más abajo de la línea, como vi mucho de preguntas semi relacionadas en los foros aquí, pero no una que realmente defina el problema.

+5

¡GRACIAS! Tuve el mismo problema, fue porque estaba usando LinearLayout.LayoutParams en lugar de TableRow.LayoutParams ... ¡error tonto pero me salvaste de mucha frustración! – RyanG

+0

¡Solo quiero decir gracias! ¡Salvaste mi día! – Zookey

+3

Durante dos horas traté de resolver esto. Gracias hombre. – arenaq

0

¿Cuál es la 3ra variable en layoutparams que se supone que debe hacer, es esa alfa? ¿qué ocurre si en comentario paramsExample.setMargins

finalmente lo que pasa si a txtviewExample.setVisible(View.Visible) después setLayoutParams?

esas serían las cosas que me gustaría probar si tiene bien no

+0

la tercera referencia en el layoutparams es para peso, equivalente a 'android: layout_weight =" 1.0 "' parte en el XML. y el '.setVisible (View.VISABLE);' no funcionó. Gracias, sin embargo. – Octoth0rpe

+0

FWIW, también intenté no usar 'txtviewExample.setLayoutParms (paramsExample);' y luego, durante el addView real en el diseño, lo especifico como un parámetro secundario. Todavía no funcionó: 'tblrow.addView (txtviewExample, paramsExample);' – Octoth0rpe

+0

en 'setText' Supongo que tienes una variable de cadena real. esta variable tiene datos cuando se llama? – CQM

1
private TextView txtviewExample = new TextView(this); 

private void buildTextView(){ 
    LayoutParams paramsExample = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT,1.0f); 
    txtviewExample.setId(textViewExampleID); 
    txtviewExample.setBackgroundResource(R.drawable.textview_9patch_white); 
    txtviewExample.setGravity(Gravity.CENTER); 
    txtviewExample.setTextColor(getResources().getColor(android.R.color.black)); 
    paramsExample.setMargins(20, 20, 20, 20); 
    txtviewExample.setPadding(20, 20, 20, 20); 
    txtviewExample.setTextSize(40); 
    txtviewExample.setText("customExample"); 

    setContentView(txtviewExample);//when you don't use SETTER method for TextView you can't view the desireable text on the UI// 
} 

// utilizar

+0

use setContentView (txtviewExample) para hacer que el texto sea visible en la pantalla de la interfaz de usuario – killer

+0

¿No puede simplemente comentar en lugar de responder una pregunta ya respondida? – NREZ

Cuestiones relacionadas