¿Cómo puedo hacer que FrameLayout llene la altura de su padre para que la página entera se mueva?

Tengo un FrameLayout que carga Fragments tocando en pestañas en un TabWidget . No puedo averiguar cómo hacer que la altura del FrameLayout tan alta como su contenido, de modo que el conjunto que contiene ScrollView se desplazará juntos como uno en lugar de una vista de desplazamiento independiente.

He aquí un ejemplo visual de la estructura de este Fragment :

Introduzca aquí la descripción de la imagen

Como se puede ver, la altura visible del diseño de trama sólo revela una fila del fragmento, cuando de hecho, hay unos pocos. Puedo desplazarme dentro del FrameLayout para ver las otras filas como es ahora, pero eso no es lo que estoy buscando. El FrameLayout se compone de un LinearLayout contiene un GridView con su layout_height s establecido en wrap_content .

Traté de codificar la altura de la FrameLayout a algo así como 500dp y funciona muy bien excepto por el hecho de que ya no es dinámicamente de tamaño. ¿Necesitaría cambiar el tamaño de FrameLayout programáticamente cada vez que una nueva imagen se carga en el contenido interno? ¿Existe un atributo de diseño que pueda establecer para que pueda extender su altura para que coincida con su contenido interno?

Aquí está mi archivo xml de diseño:

 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" > <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content"> <RelativeLayout android:layout_width="fill_parent" android:layout_height="200dp"> <!-- CONTAINS USER INFO AND STATS --> </RelativeLayout> <android.support.v4.app.FragmentTabHost android:id="@android:id/tabhost" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#ffffff"> <TabWidget android:id="@android:id/tabs" android:layout_width="fill_parent" android:layout_height="60dp" android:weightSum="2"> </TabWidget> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="fill_parent" android:layout_height="wrap_content" > </FrameLayout> </LinearLayout> </android.support.v4.app.FragmentTabHost> </LinearLayout> </ScrollView> 

¡Gracias!


Ya que voy a establecer una recompensa en esto, pensé que compartiría lo que he descubierto hasta ahora.

En las miniaturas, onSuccess cuando se carga cada imagen, llamo a una función en el GridLayout que contiene las imágenes que cuenta las imágenes y establece la altura del GridLayout . Esto funciona bien, aunque parece que sería un poco ineficiente.

Lo que estoy haciendo es establecer la altura de GridLayout y luego llamar requestLayout e invalidate en él y es padre (s). Esto funciona, pero no como la carga de imágenes. Funcionará si voy a una pestaña diferente y vuelvo a las miniaturas, curiosamente. Lo que me hace pensar que no estoy actualizando en el momento adecuado o en el objeto correcto.

De todos modos, eso dijo. ¿Alguien sabe cómo hacer que la altura de un GridLayout expanda para mantener su contenido (en lugar de desplazarse) para poder desplazar la página entera (incluida la sección superior)?


También debería agregar el diseño de GridView :

 <GridView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/grid" android:stretchMode="columnWidth" android:gravity="center" android:layout_width="fill_parent" android:layout_height="wrap_content" android:drawSelectorOnTop="false" android:fastScrollAlwaysVisible="false" android:fastScrollEnabled="false" android:numColumns="3" android:choiceMode="none"> </GridView> 

Yo estaba en una situación similar pero tenía un ListView en lugar de un GridView. Usted tiene razón en la parte cuando usted tiene que fijar la altura dinámicamente cada vez que usted agrega un artículo o si usted llama notifyDataSetChanged ().

ESTE CÓDIGO ES PARA LA LISTA CON ALTURA DIFERENTE PARA CADA FILA

 private void setListViewHeightBasedOnChildren(MyQueueAdapter listAdapter) { int desiredWidth = MeasureSpec.makeMeasureSpec( mListView.getWidth(), MeasureSpec.AT_MOST); int totalHeight = 0; View view = null; int i; for (i = 0; i < listAdapter.getCount(); i++) { view = listAdapter.getView(i, view, mListView); view.measure(desiredWidth, MeasureSpec.UNSPECIFIED); totalHeight += view.getMeasuredHeight(); } ViewGroup.LayoutParams params = mListView.getLayoutParams(); params.height = heightList + (mListView.getDividerHeight() * (listAdapter .getCount() + 3)); heightListComplete = params.height; mListView.setLayoutParams(params); } 

Es necesario modificar este código de acuerdo a sus necesidades, no necesita el bucle como la altura de cada fila es estática en su caso. Avísame si necesitas más ayuda.

ALTERNATIVA

Si conoce la altura de la vista en dp puede convertir fácilmente el dp en px y establecer la altura de su gridview de acuerdo al número de filas.

Cuando utilice tamaños dinámicos, se encontrará con problemas una vez que haya puesto match_parent dentro de una cosa wrap_content . Uno trata de obtener un pequeño como es el contenido y el contenido trata de ser tan grande como es padre. Ninguno de los dos lados sabrá cómo escalar correctamente al final.

ScrollView es una cosa que cae en esta categoría. Es una ventana escalable a su contenido por lo que no puede ser wrap_content y el contenido no puede ser match_parent porque es padre es un espacio virtual infinito.

  • Cambiar <ScrollView android:layout_height="wrap_content" para match_parent (o un tamaño fijo).

Para resolver el tamaño del contenido

  • LinearLayout diseño raíz ( LinearLayout en su caso) de su ScrollView para que sea un tamaño fijo por lo que su contenido puede ser match_parent nuevo.
  • wrap_content todo el camino.
  • Combinar los dos: wrap_content hasta que un niño define un tamaño absoluto, entonces match_parent dentro de allí.

La ruta wrap_content sólo funcionará si todos los elementos del diseño de interior a exterior se expanden más correctamente según su contenido. Nada puede confiar en los límites de los padres a menos que añada alguno.

Su contenido se ve bastante dinámico en tamaño. Por lo tanto, es probable que necesite utilizar algún código para establecer tamaños manualmente en función del contenido. Por ejemplo, si esas imágenes dentro de su marco de pestaña son un GridView (esencialmente ScrollView con el contenido de la cuadrícula de nuevo) tendrá que configurar su tamaño manualmente. Más de 1 grado de libertad en envolver los contenedores de dimensionamiento dinámico no es solucionable automáticamente.

El padre de la disposición del marco es el diseño lineal cuya altura es wrap_content. También, la altura de tu framelayout es wrap_content. Cambie ambos a fill_parent. Usar match_parent es más preferido ahora un día insted de fill_parent

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