Establecer el ancho en wrap_content para TextView a través del código

92

Puede alguien ayudarme a cómo configurar el ancho de TextViewa wrap_contenttravés de código y no de XML?

Estoy creando dinámicamente un TextViewcódigo en, entonces, ¿hay alguna forma de establecer su ancho a wrap_contenttravés del código?

Android_programmer_camera
fuente

Respuestas:

127
TextView pf = new TextView(context);
pf.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

Para diferentes diseños como ConstraintLayouty otros, tienen los suyos propios LayoutParams, así:

pf.setLayoutParams(new ConstraintLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 

o

parentView.addView(pf, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
Franco
fuente
8
android.view.ViewGroup$LayoutParams cannot be cast to android.widget.LinearLayout$LayoutParams
Francisco Corrales Morales
bueno, la diferencia principal es que en el primer código estamos creando un nuevo TextView con esa configuración ya. En el segundo, estamos agregando a una vista existente, y también estamos configurando esos parámetros. Para el problema del elenco, creo que debes lanzar la clase adecuada
Franco
78

Hay otra forma de lograr el mismo resultado. En caso de que necesite configurar solo un parámetro, por ejemplo 'altura':

TextView textView = (TextView)findViewById(R.id.text_view);
ViewGroup.LayoutParams params = textView.getLayoutParams();
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
textView.setLayoutParams(params);
Dmitry
fuente
Esto funciona muy bien. Si esto se hace LinearLayout, no parece que ll.invalidate()sea ​​necesario. ¿Por qué?
midiwriter
1
Supongo que nunca lo sabremos
Denny
49

Solución para cambiar el TextViewancho para envolver contenido .

textView.getLayoutParams().width = ViewGroup.LayoutParams.WRAP_CONTENT; 
textView.requestLayout();  
// Call requestLayout() for redraw your TextView when your TextView is already drawn (laid out) (eg: you update TextView width when click a Button). 
// If your TextView is drawing you may not need requestLayout() (eg: you change TextView width inside onCreate()). However if you call it, it still working well => for easy: always use requestLayout()

// Another useful example
// textView.getLayoutParams().width = 200; // For change `TextView` width to 200 pixel
Phan Van Linh
fuente
6
Solución simple y correcta, porque no anula otros parámetros.
CoolMind
2
Marqué mi respuesta para eliminarla ya que esto es mucho más simple.
FrankKrumnow
2
Esta es la mejor solución
pedram shabani
4

Estoy publicando texto de edición de múltiples líneas base de Android Java.

EditText editText = findViewById(R.id.editText);/* edittext access */

ViewGroup.LayoutParams params  =  editText.getLayoutParams(); 
params.height = ViewGroup.LayoutParams.WRAP_CONTENT;
editText.setLayoutParams(params); /* Gives as much height for multi line*/

editText.setSingleLine(false); /* Makes it Multi line */
Aadarsh ​​Mathur
fuente
1

Creo que este código responde a tu pregunta.

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) 
holder.desc1.getLayoutParams();
params.height = RelativeLayout.LayoutParams.WRAP_CONTENT;
holder.desc1.setLayoutParams(params);
DeVYaGhI
fuente
0

Una pequeña actualización en esta publicación: si está utilizando ktx dentro de su proyecto de Android, hay un pequeño método de ayuda que hace que la actualización de LayoutParams sea mucho más fácil.

Si desea actualizar, por ejemplo, solo el ancho, puede hacerlo con la siguiente línea en Kotlin.

tv.updateLayoutParams { width = WRAP_CONTENT }
Stefan Medack
fuente