Estoy intentando crear una actividad que presente algunos datos al usuario. Los datos son tales que se pueden dividir en 'palabras', cada una de las cuales es un widget, y la secuencia de 'palabras' formaría los datos (¿'oración'?), El widget ViewGroup que contiene las palabras. Como el espacio requerido para todas las 'palabras' en una 'oración' excedería el espacio horizontal disponible en la pantalla, me gustaría ajustar estas 'oraciones' como lo haría con un texto normal.
El siguiente código:
public class WrapTest extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout l = new LinearLayout(this);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
LinearLayout.LayoutParams mlp = new LinearLayout.LayoutParams(
new ViewGroup.MarginLayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
mlp.setMargins(0, 0, 2, 0);
for (int i = 0; i < 10; i++) {
TextView t = new TextView(this);
t.setText("Hello");
t.setBackgroundColor(Color.RED);
t.setSingleLine(true);
l.addView(t, mlp);
}
setContentView(l, lp);
}
}
produce algo como la imagen de la izquierda, pero me gustaría un diseño que presentara los mismos widgets que en la derecha.
¿Existe tal diseño o combinación de diseños y parámetros, o tengo que implementar mi propio ViewGroup para esto?
fuente
Hice mi propio diseño que hace lo que quiero, pero es bastante limitado en este momento. Por supuesto, los comentarios y las sugerencias de mejora son bienvenidos.
La actividad:
O en un diseño XML:
Y el diseño:
Con el resultado:
fuente
Implementé algo muy similar a esto, pero usando lo que creo que es una forma un poco más estándar de manejar el espaciado y el relleno. Por favor, háganme saber lo que piensan y siéntanse libres de reutilizar sin atribución:
Esto también requiere una entrada en /res/values/attrs.xml, que puede crear si aún no está allí.
El uso en un diseño xml se ve así:
fuente
El proyecto android-flowlayout de ApmeM también admite saltos de línea.
fuente
Aquí está mi versión simplificada de solo código:
fuente
Hay un problema con la primera respuesta:
En un ListView, por ejemplo, a los elementos de la lista se les pasa un heightMeasureSpec de 0 (UNSPECIFIED) y, por lo tanto, aquí, el MeasureSpec de tamaño 0 (AT_MOST) se pasa a todos los niños. Esto significa que todo el PredicateLayout es invisible (altura 0).
Como solución rápida, cambié la altura del niño MeasureSpec de esta manera:
y entonces
que parece funcionar para mí, aunque no maneja el modo EXACTO, lo que sería mucho más complicado.
fuente
Mi versión ligeramente modificada basada en la publicada aquí anteriormente:
Centra todos los elementos horizontalmente
fuente
He actualizado esta muestra para corregir un error, ahora, ¡cada línea puede tener una altura diferente!
fuente
Algunas de las diferentes respuestas aquí me darían una ClassCastException en el editor de diseño de Exclipse. En mi caso, quería usar ViewGroup.MarginLayoutParams en lugar de hacer el mío. De cualquier manera, asegúrese de devolver la instancia de LayoutParams que su clase de diseño personalizado necesita en generateLayoutParams. Así es como se ve el mío, simplemente reemplace MarginLayoutParams con el que necesita su ViewGroup:
Parece que se llama a este método para asignar un objeto LayoutParams para cada niño en ViewGroup.
fuente
fuente
Adapté parte de la oda anterior e implementé un diseño de flujo que centra todas las vistas de los niños, horizontales y verticales. Se adapta a mis necesidades.
fuente
tratar :
fuente
Intente configurar los LayoutParams de lp para que sean
WRAP_CONTENT
.Establecer mlp para que sea
WRAP_CONTENT
,WRAP_CONTENT
asegura que sus TextView (s) t sean lo suficientemente anchos y altos para contener "Hello" o cualquier String que ingrese . Creo que l puede no ser consciente de cómo su amplia t s' son. ElsetSingleLine(true)
puede estar contribuyendo también.fuente