Quiero tener una cuadrícula de 2x2 con botones dentro. Esto es solo ICS, así que estoy tratando de usar el nuevo GridLayout dado.
Aquí está el XML de mi diseño:
<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/favorites_grid"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00ff00"
android:rowCount="2"
android:columnCount="2">
<Button
android:text="Cell 0"
android:layout_row="0"
android:layout_column="0"
android:textSize="14dip" />
<Button
android:text="Cell 1"
android:layout_row="0"
android:layout_column="1"
android:textSize="14dip" />
<Button
android:text="Cell 2"
android:layout_row="1"
android:layout_column="0"
android:textSize="14dip" />
<Button
android:text="Cell 3"
android:layout_row="1"
android:layout_column="1"
android:textSize="14dip" />
</GridLayout>
El problema es que mis puntos de vista no se extienden de manera uniforme para cada fila. Esto causa mucho espacio extra a la derecha de mi GridLayout.
Intenté configurar layout_gravity="fill_horizontal"
pero eso solo se aplica a la última vista de la fila. Esto significa que la celda 1 se extiende hasta el final para dar suficiente espacio para la celda 0.
¿Pensamientos sobre cómo abordar esto?
Respuestas:
ACTUALIZACIÓN : los pesos son compatibles a partir de la API 21. Consulte la respuesta de PaulT para obtener más detalles. FINALIZAR LA ACTUALIZACIÓN Existen limitaciones cuando se usa GridLayout, la siguiente cita se toma de la documentación .
Aquí hay un pequeño ejemplo que usa subvistas LinearLayout. (Usé vistas espaciales que ocupan el área no utilizada y empujan los botones a la posición deseada).
fuente
A partir de API 21, la noción de peso se agregó a GridLayout. Para admitir dispositivos Android más antiguos, puede usar GridLayout de la biblioteca de soporte v7.
El siguiente XML da un ejemplo de cómo puede usar pesos para llenar el ancho de la pantalla.
fuente
FrameLayout
que contenía unButton and an
ImageView` (para tener un icono superpuesto en un botón que mostraba retroalimentación visual cuando se tocaba ... historia larga) como parte de un teclado. La configuracióncolumnWeight
ygravity
en todos los demásButton
funcionó bien, pero se rompió en elFrameLayout
. Dejándolo solo porFrameLayout
hecho, todo se presenta de manera uniforme como se esperaba.Appcompat21 GridLayout tiene los pesos de columna y fila que se pueden usar como a continuación para crear de manera uniforme cada elemento de cuadrícula en la distribución de cuadrícula como la imagen de arriba.
fuente
compile "com.android.support:gridlayout-v7:$supportVersion"
app:columnCount="2"
):xmlns:app="http://schemas.android.com/apk/lib/android.support.v7.widget.GridLayout"
A partir de API 21 sin la biblioteca de soporte v7 con ScrollView:
XML:
fuente
Puede establecer el ancho de cada niño dinámicamente:
fuente
useDefaultMargins="true"
- funciona perfectamente con ellos configurados parafalse
Intente agregar lo siguiente a su especificación GridLayout. Eso debería funcionar.
fuente
Esta es la respuesta correcta
fuente
Finalmente encontré la solución. Como dijo Rotemmiz, debes hacerlo dinámicamente después. Este código estira los botones para llenar la vista horizontalmente, pero lo mismo se puede hacer verticalmente.
(El 20 es para el relleno interno y externo y los márgenes. Esto podría hacerse de manera más universal, pero esto es mucho más limpio)
Entonces se puede llamar así:
Debe hacerse con un observador porque debemos esperar a que se dibuje la vista antes de llamar a las vistas.
fuente
En mi caso, estaba agregando los botones dinámicamente, por lo que mi solución requería parte de XML y parte de Java. Tenía que encontrar y mezclar soluciones de diferentes lugares y pensé en compartirlo aquí para que otra persona que buscara una solución similar pudiera encontrarla útil.
Primera parte de mi archivo XML de diseño ...
grid:useDefaultMargins="true"
no es obligatorio, pero agregué porque eso me pareció mejor, puede aplicar otros efectos visuales (por ejemplo, relleno) como se menciona en algunas respuestas aquí. Ahora para los botones ya que tengo que agregarlos dinámicamente. Aquí está la parte de Java de mi código para hacer estos botones, estoy incluyendo solo aquellas líneas relacionadas con este contexto. Suponga que tengo que hacer botones de tantosmyOptions
disponibles para mi código y no estoy copiando el código OnClickListener también.Como estamos usando GridLayout de la biblioteca de soporte y no el GridLayout estándar, tenemos que decirle a grade sobre eso en el
YourProject.grade
archivo.fuente
Puede hacer esto mucho más rápido anulando el método ViewGroup onLayout. Esta es mi solución universal:
EDITAR: ¡No olvides match_parent para niños!
fuente
getChildAt(i).layout(viewWidth * columnIndex + margin, viewHeight * rowIndex + margin, viewWidth * columnIndex + viewWidth - margin, viewHeight * rowIndex + viewHeight - margin);
La mejor solución que podría encontrar es usar un diseño lineal (horizontal) para cada fila que desee y dentro de él asignar el ancho del botón (celda) a 0dp y el peso a 1. Para cada uno de los diseños lineales (filas) asigne la altura a 0dp y el peso a 1. Busque el código a continuación, también android: layout_gravity = "center_vertical" se usa para alinear los botones en una fila en caso de que contengan texto de longitud variable. El uso de 0dp y el peso es un truco bastante bueno pero no tan conocido.
fuente
Aquí estás :
fuente
Quería tener una tabla centrada con las etiquetas alineadas a la derecha y los valores alineados a la izquierda. El espacio extra debe estar alrededor de la mesa. Después de mucho experimentar y no seguir lo que la documentación decía que debía hacer, se me ocurrió algo que funciona. Esto es lo que hice:
Esto parece funcionar, pero GridLayout muestra el mensaje:
"Este diseño GridLayout o su padre LinearLayout es inútil"
No estoy seguro de por qué es "inútil" cuando funciona para mí.
No estoy seguro de por qué funciona o si es una buena idea, pero si lo prueba y puede proporcionar una mejor idea, una pequeña mejora o explica por qué funciona (o no funcionará) agradecería los comentarios.
Gracias.
fuente
Esta es una pregunta bastante antigua, pero obviamente de interés para mucha gente. Para un diseño simple de 4 botones como este, parece que TableLayout es la forma más fácil de lograr el resultado deseado.
Aquí hay un código de ejemplo que muestra las primeras 2 filas de una tabla con 6 columnas que abarcan el ancho de su padre. LinearLayout e ImageView en cada celda se utilizan para permitir el "encendido y apagado" de una imagen dentro de la celda mientras el color de la celda persiste.
fuente
Antigua pregunta, pero quería agregar mi solución. Creé un "diseño de cuadrícula lineal" que simula una cuadrícula pero usando diseños lineales anidados. Esto le permite estirarse para llenar el espacio.
fuente
Deseo que esto ayude a alguien
Resultado
Código:
fuente
Resultado:
Intenta algo como esto:
Si desea ancho y alto específicos para sus celdas, use:
fuente
Este es el código para una aplicación más predeterminada sin los botones, esto es muy útil para mí.
fuente
Tengo el mismo problema y creo que solo establezco el ancho y la altura mediante programación:
establecer el ancho de los botones con metrics.widthPixels / 2 metrics es objeto de DisplayMetrics.
fuente
puedes encontrar los tutoriales completos aquí, diseño de cuadrícula de Android con CardView y OnItemClickListener
fuente
Esto es lo que hice y estoy feliz de decir que esto funcionó para mí. Yo también quería una cuadrícula de elementos de 2x2, 3x3, etc. para cubrir toda la pantalla. Las cuadrículas no se adhieren al ancho de la pantalla. LinearLayouts funciona, pero no puede usar pesos anidados.
La mejor opción para mí era usar Fragments . Usé esto tutorial para comenzar con lo que quería hacer.
Aquí hay un código:
Actividad principal:
actividad_principal_6 XML (infla 3 fragmentos)
Diseño de fragmento base
Fragment Class (solo maneja la inicialización de una vista personalizada) infla 2 mosaicos por fragmento
}
¡Eso es!
Este es un trabajo extraño para usar pesos anidados, esencialmente. Me da una cuadrícula perfecta de 2x3 que llena toda la pantalla de mi tableta de 10 pulgadas y mi ADN de droide HTC. ¡Dejame saber como te va!
fuente