Cómo establecer layout_columnWeight para un niño GridLayout cuando se agrega mediante programación?

Me gustaría usar un GridLayout (no GridView ) como tablero para un juego como ajedrez o damas. Como soy un poco reacio a utilizar un archivo xml con 64 niños View s, he intentado agregarlos mediante programación.

Para mantener las cosas simples, comencé con el uso de TextView como TextView View s para el GridLayout .

Mi problema es que el View s no se distribuyen de manera uniforme, y que no sé cómo obtener una distribución uniforme en mi código java. No hay ningún método como "setWeight ()" para establecer layout_columnWeight y layout_rowWeight .

En la actualidad, este es mi activity_dynamic_grid_layout.xml :

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:layout_width="match_parent" android:layout_height="80dp" android:id="@+id/ivLogo" android:background="#ff0000" android:layout_alignParentTop="true" android:layout_alignParentLeft="true" android:layout_alignParentStart="true"/> <android.support.v7.widget.GridLayout android:id="@+id/grid_layout" android:background="#004080" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/ivLogo" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginTop="36dp"> </android.support.v7.widget.GridLayout> 

He establecido el ancho y la altura de match_parent a match_parent aquí, pero los estoy cambiando en tiempo de ejecución usando un ViewTreeObserver.OnPreDrawListener para conseguir un tablero cuadrado. Esto trabaja, el fondo coloreado está mostrando un espacio cuadrado según lo previsto.

Mi onCreate ()

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_dynamic_grid_layout); GridLayout gl = (GridLayout) findViewById(R.id.grid_layout); gl.setColumnCount(8); gl.setRowCount(8); for(int i=0; i<gl.getRowCount(); i++) { GridLayout.Spec rowSpec = GridLayout.spec(i, 1, GridLayout.FILL); for(int j=0;j<gl.getColumnCount();j++) { GridLayout.Spec colSpec = GridLayout.spec(j,1, GridLayout.FILL); TextView tvChild = new TextView(this); tvChild.setText("[ " + i + " | " + j + " ]"); tvChild.setTextSize(18f); tvChild.setTextColor(Color.WHITE); tvChild.setGravity(Gravity.CENTER); GridLayout.LayoutParams myGLP = new GridLayout.LayoutParams(); myGLP.rowSpec = rowSpec; myGLP.columnSpec = colSpec; gl.addView(tvChild, myGLP ); } } final View rootView = findViewById(R.id.dynamic_root); rootView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { int w = rootView.getMeasuredWidth(); int h = rootView.getMeasuredHeight(); int min = Math.min(w, h); ViewGroup.LayoutParams lp = gl.getLayoutParams(); lp.width = min - min % 9; lp.height = lp.width; gl.setLayoutParams(lp); rootView.getViewTreeObserver().removeOnPreDrawListener(this); return true; } }); } 

Lo que he probado ya:

Puse un niño de TextView en el archivo de disposición e intenté copiar el layout_columnWeight y el layout_rowWeight de su GridLayout.LayoutParams :

  <android.support.v7.widget.GridLayout ...> <TextView android:id="@+id/clone_my_params" android:text="[ 0 | 0 ]" android:textColor="#ffffff" android:textSize="18sp" app:layout_column="0" app:layout_row="0" app:layout_columnWeight="1" app:layout_rowWeight="1" /> </android.support.v7.widget.GridLayout> 

Código adicional en onCreate() , antes del bucle doble:

 TextView v = (TextView)gl.findViewById(R.id.clone_my_params); v.setGravity(Gravity.CENTER); GridLayout.LayoutParams gridLayoutParamsToCopy = new GridLayout.LayoutParams(v.getLayoutParams()); 

Dentro del bucle, salté (i, j) = (0,0) y cambié

  GridLayout.LayoutParams myGLP = new GridLayout.LayoutParams(); 

a

  GridLayout.LayoutParams myGLP = new GridLayout.LayoutParams(gridLayoutParamsToCopy); 

Antes del cambio, todos los elementos estaban en la esquina superior izquierda, el espacio excedente fue dado a la última fila / columna. Después del cambio, la primera fila / columna tenía el espacio en exceso, sin cambios para los otros elementos.

Llamar gl.invalidate() y / o gl.requestLayout() después de que el bucle doble no tuvo ningún efecto.

Por lo tanto, parece que no he logrado establecer el peso deseado mediante el constructor de copia.

Para establecer el peso en los niños de su Gridlayout use uno de los métodos spec () (como éste) que toma un valor de float.

Otro enfoque sería hacer una vista personalizada (en cuyo caso necesitará dibujar manualmente las piezas) o un grupo de vistas personalizado (en cuyo caso, el grupo de vistas personalizado sólo se ocupará del posicionamiento de las piezas, esto será apropiado si usted Planea tener jerarquías de vista más complejas que un simple TextView).

  • Configuración de la configuración de proxy de Android mediante programación mediante el método System.Global
  • Facebook Login no funciona correctamente (Parse)
  • Ciclo de vida de las aplicaciones de Android y uso de
  • La actividad nunca se inicia cuando se hace clic en la notificación en android versión 4.0
  • ¿Cómo extraer archivos sin extensión del directorio de almacenamiento externo?
  • Tomar la captura de pantalla en libgdx
  • ¿Cómo se muestra un objeto Java HttpPost como una cadena?
  • Android - ListView onItemClick () no disparando en 4.1 jellybean
  • Java Floating Point Precision Issue
  • La biblioteca de ActionBarSherlock está llena de errores después de ser importada
  • ¿Cómo manejar múltiples oyentes de interacción de fragmentos en una actividad correctamente?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.