Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


La adición dinámica de fragmentos con diseño xml a GridLayout no es workng

En nuestra aplicación estamos tratando de añadir dinámicamente fragmentos a un GridLayout. El diseño de la cuadrícula vacía se define en XML como es el diseño del fragmento. En tiempo de ejecución examinamos algunos datos y de éstos se determina el número de fragmentos que se van a añadir al diseño, así como el diseño a utilizar para cada fragmento. Cuando tenemos el fragmento asignar un tamaño a su vista generada todo funciona, sin embargo, si especificamos el tamaño en el archivo de diseño para el fragmento nada aparece en el diseño de la cuadrícula. Obviamente podríamos simplemente especificar el tamaño cuando creamos la vista, pero preferiríamos hacerlo en los diseños xml para los fragmentos, porque eso nos permitiría aprovechar el sistema incorporado de Android para seleccionar los diseños correctos para cada dispositivo.

Estoy utilizando fragmentos de la biblioteca de soporte. NO estoy usando la biblioteca de soporte GridLayout si eso hace una diferencia

El código relevante y xml son los siguientes:

El GridLayout XML:

<?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android"> <ScrollView android:id="@+id/grid_scroll" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/bottom_fragment" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" android:layout_marginRight="8dp" android:layout_marginTop="?android:attr/actionBarSize" android:overScrollMode="ifContentScrolls" > <GridLayout android:id="@+id/grid" android:layout_width="match_parent" android:layout_height="wrap_content" android:alignmentMode="alignMargins" android:animateLayoutChanges="true" android:columnCount="3" android:columnOrderPreserved="true" android:orientation="horizontal" android:overScrollMode="ifContentScrolls" android:rowOrderPreserved="true" > </GridLayout> </ScrollView> </merge> 

Un ejemplo del fragmento XML

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="200dp" android:layout_height="100dp" android:alpha="1" > <Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="match_parent" android:alpha="1.0" /> </RelativeLayout> 

El método Fragment onCreateView ()

 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); View view; GridLayout.Spec rowSpec = GridLayout.spec(mRowStart, mRowSpan); GridLayout.Spec columnSpec; GridLayout.LayoutParams childParams; if (large) {; view = inflater.inflate(R.layout.my_place_large, container, false); columnSpec = GridLayout.spec(mColumnStart, 2); childParams = new GridLayout.LayoutParams(rowSpec, columnSpec); //childParams.width = 200; //If I do this everything works regardless of the layout size } else { view = inflater.inflate(R.layout.my_place_small, container, false); columnSpec = GridLayout.spec(mColumnStart, 1); childParams = new GridLayout.LayoutParams(rowSpec, columnSpec); //childParams.width = 100; //If I do this everything works regardless of the layout size } childParams.setMargins(0, 0, 0, 0); //childParams.height = 100; //If I do this everything works regardless of the layout size view.setLayoutParams(childParams); view.setId(ID); return view; } 

Para agregar fragmentos al diseño

 private void populateGrid() { RelativeLayout gridParent = (RelativeLayout) mParentActivity.findViewById(R.id.locations); mLocationsGrid = (GridLayout) gridParent.findViewById(R.id.grid); nColumns = mLocationsGrid.getColumnCount(); mAdapter = new MyAdapter(mContext, this, mResolver); //This is how I keep track of the various fragments depending on my app's state int nCards = mAdapter.getNumberOfCards(); FragmentManager fragmentManager = mParentActivity.getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); for (int i = 0; i < nCards; ++i) { fragmentTransaction.add(mLocationsGrid.getId(), mAdapter.getFragmentAtIndex(i), String.valueOf(i)); } fragmentTransaction.commit(); mPopulated = true; } 

Creo que debería cubrirlo. Sólo para reiterar, si descomentar las líneas que definen explícitamente la dimensión en onCreateView (), se muestran correctamente en GridLayout, así que sé todo lo que hace un seguimiento de los fragmentos y esas obras, al igual que la transacción de fragmentos. El problema viene cuando intento especificar el tamaño en el xml del fragmento en cuyo caso consigo una pantalla en blanco.

Sus pensamientos, sugerencias y reflexiones son apreciados. Gracias, Jared

  • ActionBar en PreferenceActivity
  • Establecimiento de diferentes colores de divisor para cada elemento en la vista de lista
  • Fragmentos estáticos vs. Fragmentos dinámicos
  • EditText: establece el número de caracteres programáticamente
  • Animación en la barra de notificaciones Vista personalizada
  • ¿Cómo utilizar la fuente personalizada en android xml?
  • Instrucción format en un archivo de recursos de cadena
  • OnItemClickListener de spinner
  • One Solution collect form web for “La adición dinámica de fragmentos con diseño xml a GridLayout no es workng”

    Esto viene muy tarde, pero en la posibilidad de que esto todavía puede ser de utilidad. El problema es que está reemplazando los parámetros de diseño XML cuando establece dinámicamente el nuevo LayoutParams. IE, cuando lo haces:

      view.setLayoutParams(childParams); 

    Esto borrará la configuración original de altura y ancho de XML. El hecho de que esté dejando el parámetro width / height de childParams en blanco en el código no significa que un valor no esté establecido. En el caso de GridLayout, se establecen en undefined .

    La solución sería guardar primero la altura / anchura de LayoutParam existente de View y usarla al crear el nuevo LayoutParam dinámicamente. Ejemplo:

     if (large) {; view = inflater.inflate(R.layout.my_place_large, container, false); ViewGroup.LayoutParams oldParams = view.getLayoutParams(); columnSpec = GridLayout.spec(mColumnStart, 2); childParams = new GridLayout.LayoutParams(rowSpec, columnSpec); childParams.width = oldParams.width; } 

    Esto le permitirá mantener la anchura / altura en XML mientras aplica las especificaciones de fila / col en el código.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.