2011-05-26 29 views
9

Necesito centrar la vista de cuadrícula horizontalmente en my android layout.xml. He buscado en google por bastante tiempo pero no he tenido éxito en encontrar una respuesta.Android: gridview central horizontalmente

Solo puedo cambiar la posición horizontal de la cuadrícula cambiando StrechMode, pero mis elementos no están cerca uno del otro. que necesito es que los artículos estén uno cerca de otro (sin espacios) y estén centrados horizontalmente. Elijo strechmode = none, por lo que ahora mis elementos están cerca unos de otros, pero están a la izquierda de la pantalla, solo quiero que estén centrados horizontalmente.

Aquí está mi diseño xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:background="@drawable/background" 
      android:gravity="center"> 

<GridView android:id="@+id/lw_gridview" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:numColumns="3" 
      android:columnWidth="48dp" 
      android:horizontalSpacing="0dp" 
      android:verticalSpacing="0dp" 
      android:stretchMode="none" 
      /> 


</LinearLayout> 

Aquí es un fragmento de una imagen que se encuentra en gridview por el adaptador de la imagen:

imageView = new ImageView(context); 
imageView.setLayoutParams(new GridView.LayoutParams(48,48)); //on medium density 
imageView.setScaleType(ImageView.ScaleType.CENTER); 
imageView.setPadding(0, 0, 0, 0); 

¿Cómo puedo tener éxito?

Respuesta

15

Centré mi vista de cuadrícula manualmente, calculando y configurando su relleno. Aquí es lo que mi onCreate hace:

  • averiguar ancho de la densidad de pantalla y la pantalla
  • convertir valores constantes de artículo ancho y espaciamiento de DIP a los píxeles
  • calcular el número de columnas puedo encajar.

ecuación se parece a esto, numColumns es la única incógnita:

numColumns * itemWidth + (numColumns - 1) * spacingBetweenItems + selectorPadding <= sreenWidth

  • tener numColumns, calcular la cantidad de espacio horizontal mi vista de cuadrícula realmente necesita
  • tiene una anchura real de cuadrícula ver, establecer el relleno para que termine en el centro de la pantalla

OK, y aquí hay algo de código:

// Convert DIPs to pixels 
DisplayMetrics metrics = new DisplayMetrics(); 
getWindowManager().getDefaultDisplay().getMetrics(metrics); 
mSizePx = (int) Math.floor(SIZE_DIP * metrics.scaledDensity); 
mSpacingPx = (int) Math.floor(SPACING_DIP * metrics.scaledDensity); 

GridView gridview = (GridView) findViewById(R.id.gridview); 
// Find out the extra space gridview uses for selector on its sides. 
Rect p = new Rect(); 
gridview.getSelector().getPadding(p); 
int selectorPadding = p.left + p.right; 

// Determine the number of columns we can fit, given screen width, 
// thumbnail width, and spacing between thumbnails. 
int numColumns = (int) Math.floor(1f * (metrics.widthPixels - selectorPadding + mSpacingPx) 
     /(mSizePx + mSpacingPx)); 

int contentWidth = numColumns * mSizePx; // Width of items 
contentWidth += (numColumns - 1) * mSpacingPx; // Plus spaces between items 
contentWidth += selectorPadding; // Plus extra space for selector on sides 

// Now calculate amount of left and right margin so the grid gets 
// centered. This is what we 
// unfortunately cannot do with layout_width="wrap_content" 
// and layout_gravity="center_horizontal" 
int slack = metrics.widthPixels - contentWidth; 

gridview.setNumColumns(numColumns); 
gridview.setPadding(slack/2, slack/2, slack/2, slack/2); 
+0

Funciona para mí Gracias – amiekuser

+1

¿Cómo puedo lograr el diseño dinámico de la imagen que se muestra en este enlace: http: //stackoverflow.com/questions/19156385/how-to-cenralize-last-uneven-row-in-gridview- in-android. ¿Puedes guiar/sugerir/ejemplo para esto? – YuDroid

+0

@YuDroid ¿Ha logrado esto [cómo-para-centrar-última-desigual-fila-en-cuadrícula] (http://stackoverflow.com/questions/19156385/how-to-cenralize-last-uneven-row-in -gridview-in-android), ¿la respuesta anterior resuelve esto ?, estoy teniendo el mismo problema, por favor, que alguien me dé una solución –

0

¿Ha comprobado que su GridView se encuentre correctamente dentro de LinearLayout? Pruebe usar android:layout_gravity="center" para GridView. Además, experimente con android:gravity= y posición diferente para obtener una visión más clara de cómo funciona la gravedad para los diseños.

+0

gravedad = "centro" en el centro de los padres hace que gridview verticalmente, pero no horizontalmente. gravity = "center" y gravity_layout = "center" en gridview no hace nada. En otros componentes (no en la vista de cuadrícula) la gravedad funciona correctamente :) – Judrius

+0

Te digo cómo lo hice - Acabo de agregar algunos márgenes (el mismo tamaño para centrar en el diseño) – ACM64

11

Establecer el modo de estiramiento a columnWidth en su diseño o estilo GridView:

androide: stretchMode = "columnWidth"

El ancho de columna se estira para llenar el espacio disponible. Puede envolver sus elementos de cuadrícula en un contenedor transparente que se estirará uniformemente mientras conserva el ancho de su contenido visible. El atributo android: columnWidth funcionará como "ancho mínimo de columna". Esto también funciona con android: numColumns = auto_fit, android: horizontalSpacing y android: verticalSpacing.

Dependiendo de cuáles sean sus elementos de cuadrícula, es posible que no desee agregar un contenedor transparente alrededor de su contenido. Si no lo hace, el ancho del contenido se extenderá de manera uniforme, lo que realmente puede verse mejor en más dispositivos.

+1

La sugerencia con el contenedor transparente me ayudó mucho a obtener mis columnas de autoajuste estirados a través del ancho de la grilla de rejilla, pero no estirando el contenido, de modo que las columnas ahora se ajustan perfectamente en la pantalla y ya no se alinean a la izquierda. Gracias por este James Wald. –

+0

¡Esto es genial! – Mirko

+0

¡esta es la solución de trabajo más simple! Gracias – GuilhE

1

Probablemente estoy muy tarde, pero si llegó a esta pregunta (como yo), esto es lo que he hecho para resolver el problema:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TextView 
     android:id="@+id/emotions_header" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true"/> 

    <GridView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_centerVertical="true"/> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true"/> 
</RelativeLayout> 

Mi GridView se centra en la vertical, los otros dos TextView están en la parte superior y botón-derecha.

Más información: RelativeLayout, Positioning Views

Cuestiones relacionadas