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:
- Android ScrollView se desplaza a la parte superior después de llamar a setVisibility (View.VISIBLE) en la vista secundaria
- Ocultar FAB en NestedScrollView al desplazarse
- Ver dentro de ScrollView no ocupa todo el lugar
- Detener ScrollView de establecer el enfoque en EditText
- Coloque un bloque en el centro de un ScrollView
<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.
- Android: elimina sólo el efecto FadingEdge inferior de la barra de desplazamiento
- Reciclando vistas en vista de desplazamiento
- Android ScrollView dentro de ViewPager - cómo hacer más eficiente swiping
- ScrollView no se desplaza
- Cómo poner GridView en ScrollView
- Android paddingBottom no funciona sin paddingTop
- Android No se puede eliminar el color en la parte superior e inferior
- Cómo configurar el color de un borde de desvanecimiento Android ScrollView?
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.
- Android no puede obtener matriz de bytes de la intención
- Cómo encontrar dispositivos compatibles con Android Bluetooth