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
.
- ¿Cómo tratar con DeadObjectException en el servicio fallecido?
- Android "No se pudo encontrar el estilo 'mapViewStyle' en el tema actual" error
- ¿Cómo registrar un oyente para el cambio de orientación?
- ¿Cómo se pueden manejar múltiples solicitudes para llenar modelos con RXJava Observables?
- Cómo eliminar R.java de JavaDoc
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.
- obteniendo 505 de respuesta desde el servidor
- Creación de enlaces simbólicos en Android dentro del directorio de activos de una aplicación
- Vaciar RecyclerView utilizando datos obtenidos de parse.com
- RxJava: Cómo aplicar condicionalmente a los operadores a un observable sin romper la cadena
- Llamar a System.loadLibrary dos veces para la misma biblioteca compartida
- Cliente de Java java puro
- ¿Importar Java Project en la aplicación Android?
- LibGDX en la aplicación de compras y Gradle
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).
- Servicio de descarga de Android personalizado: proporciona una fila de notificación de progreso por archivo
- Distorsionar una imagen a un cuadrángulo falla en algunos casos en Android