Android ScrollView layout (wrap_content, tamaño máximo)

Aquí es lo que me gustaría que mi ScrollView se vea así:

  • El tamaño máximo se define con el layout_weight (para que otros elementos debajo del ScrollView se muestren correctamente)
  • Si el contenido es menor que ese tamaño máximo, entonces se comporta como con layout_height="wrap_content"

Esto es lo que tengo actualmente:

 <ScrollView android:layout_height="wrap_content" android:layout_width="fill_parent" android:measureAllChildren="true" android:fillViewport="false" > 

No creo que el measureAllChildren realmente hace nada en absoluto …

Si agrego android:layout_weight , el tamaño siempre será lo que me gustaría que el máximo fuera. Sin ella, sólo se extiende más de lo que debería …

No me importa ampliar la clase ScrollView para cambiar el comportamiento de onMeasure si necesito …?

PS: Si eso hace diferencias, estoy tratando de conseguir este trabajo de Froyo en adelante.

Terminé escribiendo mi propia clase, ampliando ScrollView

Ya que usted pregunta … aquí está el código. Probablemente no la más limpia pero hace lo que quiero.

Tenga en cuenta que espera que el layout_weight se establezca cuando se crea la vista y no se debe establecer el weigthSum en el LinearLayout padre o se obtendrá cosas graciosas (ya que el peso de éste cambia del valor original a 0 dependiendo del tamaño Del contenido del ScrollView)

En primer lugar, en el archivo de diseño, la vista se declara de la siguiente manera:

 <com.matthieu.widget.ShrinkingScrollView android:id="@+id/scroll" android:scrollbars="vertical" android:layout_height="0dp" android:layout_width="fill_parent" android:layout_weight="4" android:background="#cc0000" > <TextView android:id="@+id/in_scroll_view" android:layout_height="wrap_content" android:layout_width="fill_parent" android:background="#0000bb" /> </com.matthieu.widget.ShrinkingScrollView> 

A continuación, el código para el widget:

 import android.content.Context; import android.util.AttributeSet; import android.widget.LinearLayout; import android.widget.ScrollView; public class ShrinkingScrollView extends ScrollView { private float original_weight=-1; public ShrinkingScrollView(Context context) { super(context); } public ShrinkingScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public ShrinkingScrollView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) getLayoutParams(); float previous_weight = params.weight; if (original_weight == -1) original_weight = params.weight; if ((getChildCount()>0) && (getVisibility()!=GONE)) { super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED)); int overall_height = getChildAt(0).getMeasuredHeight(); super.onMeasure(widthMeasureSpec, heightMeasureSpec); if (getMeasuredHeight() >= overall_height) { if (previous_weight != 0) { params.weight=0; params.height = overall_height; setLayoutParams(params); post(new Runnable() { public void run() { requestLayout(); } }); } setMeasuredDimension(getMeasuredWidth(),overall_height); } else if (previous_weight == 0) { params.weight = original_weight; params.height = 0; setLayoutParams(params); post(new Runnable() { public void run() { requestLayout(); } }); } } else { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } } 

Si entiendo su requisito correctamente, la forma en que he hecho algo como esto es colocar el scrollview junto con cualquier otra cosa que desee mostrar debajo de él en un diseño relativo. Luego, coloque el elemento en la parte inferior de la pantalla en primer lugar (con android: layout_alignParentBottom = "true"), luego coloque la vista de desplazamiento y colóquela encima del primer elemento usando algo como: android: layout_above = "@ Id / firstItem". Como este en el que puse una vista de la imagen en la parte inferior con una vista de desplazamiento por encima de tomar el espacio restante:

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/searchByNameScreen" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="center_horizontal" android:layout_marginTop="1dip" android:gravity="center_horizontal" android:orientation="vertical" > <ImageView android:id="@+id/bottomImage" android:layout_width="fill_parent" android:layout_height="75dip" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:paddingBottom="15dip" android:paddingLeft="10dip" android:paddingRight="10dip" android:paddingTop="7dip" android:scaleType="fitXY" android:src="@drawable/android_450x50_moreinfo" /> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/ScrollView01" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_above="@id/bottomImage" android:layout_marginBottom="3dip" android:layout_marginLeft="10dip" android:layout_marginRight="10dip" android:layout_marginTop="1dip" android:scrollbars="none" > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/aboutCopyLayout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/aboutTopLayer" android:layout_centerHorizontal="true" android:layout_gravity="center_horizontal" android:background="@drawable/rounded_background" android:gravity="center" android:padding="5dip" > <!-- android:background="@drawable/rounded_background" --> <TextView android:id="@+id/aboutCopyText" style="@style/ResortNameExtraLine" android:layout_width="fill_parent" android:layout_height="fill_parent" android:gravity="center_horizontal" android:text="@string/aboutCopy" /> </LinearLayout> </ScrollView> </RelativeLayout> 

Aquí otra solución usando tamaños en lugar de pesos. He extendido ScrollView y código agregado para implementar esta característica:

https://gist.github.com/JMPergar/439aaa3249fa184c7c0c

Espero que sea útil.

  • Cómo cambiar el tamaño de Android ScrollView
  • ScrollView vs RecyclerView para niños diferentes en Android
  • ¿La lógica detrás de startScroll en scroller?
  • Gridlayout + ScrollView
  • Cómo reproducir video de video-view que actualmente se enfoca en la vista de reciclador
  • Correctamente desplazando un EditText a la vista cuando se enfoca
  • ScrollView no se desplaza a la parte inferior
  • ListView dentro de ScrollView con DrawerLayout
  • Android ScrollView (desplazable en Horizontal y Vertical suavemente) en el que el contenido se puede agregar programable y zoomable en pinch
  • Mantener la posición de desplazamiento ScrollView para contenido dinámico
  • Adición dinámica de vistas a RelativeLayout dentro de ScrollView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.