vertical studio android android-5.0-lollipop android-6.0-marshmallow android-scrollview android-percentrelativelayout

studio - scroll android



PercentRelativeLayout dentro de ScrollView (4)

Agregue un diseño después de ScrollView porque ScrollView solo puede funcionar con un diseño secundario.

<?xml version="1.0" encoding="utf-8" ?> <ScrollView android:id="@+id/scrollView" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <android.support.percent.PercentRelativeLayout android:id="@+id/scrollContent" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_heightPercent="100%" app:layout_widthPercent="50%"> <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/holo_red_dark" android:text="kkjknadko" android:textColor="@android:color/black" app:layout_heightPercent="10%" app:layout_widthPercent="50%"/> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textView1" android:text="Abcaad" android:textColor="@android:color/black" app:layout_heightPercent="10%" app:layout_marginTopPercent="10%" app:layout_widthPercent="50%"/> <TextView android:id="@+id/textview3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textView2" android:background="@android:color/holo_red_dark" android:text="Abcd" android:textColor="@android:color/black" app:layout_heightPercent="10%" app:layout_marginTopPercent="10%" app:layout_widthPercent="50%"/> <TextView android:id="@+id/textview4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textview3" android:text="Abcd" android:textColor="@android:color/black" app:layout_heightPercent="10%" app:layout_marginTopPercent="10%" app:layout_widthPercent="50%"/> <TextView android:id="@+id/textview5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textview4" android:background="@android:color/holo_red_dark" android:text="Abcd" android:textColor="@android:color/black" app:layout_heightPercent="10%" app:layout_marginTopPercent="10%" app:layout_widthPercent="50%"/> <TextView android:id="@+id/textview6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textview5" android:text="Abcd" android:textColor="@android:color/black" app:layout_heightPercent="10%" app:layout_marginTopPercent="10%" app:layout_widthPercent="50%"/> <TextView android:id="@+id/textview7" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textview6" android:text="Abcd" android:textColor="@android:color/black" app:layout_heightPercent="10%" app:layout_marginTopPercent="10%" app:layout_widthPercent="50%"/> <TextView android:id="@+id/textview8" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textview7" android:text="Abcd" android:textColor="@android:color/black" app:layout_heightPercent="10%" app:layout_marginTopPercent="10%" app:layout_widthPercent="50%"/> </android.support.percent.PercentRelativeLayout> </LinearLayout> </ScrollView>

He creado un diseño utilizando un ScrollView que tiene un PercentRelativeLayout como su hijo. No funciona en Lollipop y en dispositivos más antiguos, pero funciona bien en dispositivos Marshmallow. Por favor revise el siguiente código:

<ScrollView android:id="@+id/scrollView" android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true"> <android.support.percent.PercentRelativeLayout android:id="@+id/scrollContent" android:layout_width="wrap_content" android:layout_height="wrap_content" app:layout_heightPercent="100%" app:layout_widthPercent="50%"> <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/holo_red_dark" android:text="kkjknadko" android:textColor="@android:color/black" app:layout_heightPercent="10%" app:layout_widthPercent="50%"/> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textView1" android:text="Abcaad" android:textColor="@android:color/black" app:layout_heightPercent="10%" app:layout_marginTopPercent="10%" app:layout_widthPercent="50%"/> <TextView android:id="@+id/textview3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textview2" android:background="@android:color/holo_red_dark" android:text="Abcd" android:textColor="@android:color/black" app:layout_heightPercent="10%" app:layout_marginTopPercent="10%" app:layout_widthPercent="50%"/> <TextView android:id="@+id/textview4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textview3" android:text="Abcd" android:textColor="@android:color/black" app:layout_heightPercent="10%" app:layout_marginTopPercent="10%" app:layout_widthPercent="50%"/> <TextView android:id="@+id/textview5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textview4" android:background="@android:color/holo_red_dark" android:text="Abcd" android:textColor="@android:color/black" app:layout_heightPercent="10%" app:layout_marginTopPercent="10%" app:layout_widthPercent="50%"/> <TextView android:id="@+id/textview6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textview5" android:text="Abcd" android:textColor="@android:color/black" app:layout_heightPercent="10%" app:layout_marginTopPercent="10%" app:layout_widthPercent="50%"/> <TextView android:id="@+id/textview7" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textview6" android:text="Abcd" android:textColor="@android:color/black" app:layout_heightPercent="10%" app:layout_marginTopPercent="10%" app:layout_widthPercent="50%"/> <TextView android:id="@+id/textview8" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/textview7" android:text="Abcd" android:textColor="@android:color/black" app:layout_heightPercent="10%" app:layout_marginTopPercent="10%" app:layout_widthPercent="50%"/> </android.support.percent.PercentRelativeLayout> </ScrollView>

Y también android:fillViewport="true" , no muestra nada en Lollipop y versiones anteriores de Android.

Desafortunadamente, el diseño de porcentaje no funcionará con ScrollView antes de M. La razón de ello es que dependen de la sugerencia de tamaño que se entregue en el paso de medición. Antes de M, la mayoría de los diseños proporcionaban una sugerencia de tamaño 0 al enviar especificaciones de medida no especificadas.

Puede intentar solucionarlo creando su propia subclase de ScrollView y anulando measureChild y measureChildWithMargins (afortunadamente, ambos están protegidos) para proporcionar una sugerencia de tamaño.

fuente - plus.google.com.

¿Puede alguien ayudarme a crear ScrollView personalizado para que funcione?


Cree una vista de scrollview personalizada y establezca la Measured Height y el Width Measured Height como desee para el Ejemplo

CustomScrollView

public class CustomScrollView extends ScrollView { public CustomScrollView(Context context) { super(context); } public CustomScrollView(Context context, AttributeSet attrs) { super(context, attrs); } public CustomScrollView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public CustomScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int size = 0; int width = getMeasuredWidth(); int height = getMeasuredHeight(); if (width > height) { size = height; } else { size = width; } setMeasuredDimension(size, size); } }

Usa Customscrollview en tu xml .

<yourscrollviewclasspath.CustomScrollView // here you have scrollview path like com.yourpackage.folder_where_your_scrollview_lies xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/scrollView" android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true" > </yourscrollviewclasspath.CustomScrollView >

Espero que esto ayude.


Encontré el mismo problema con Android K y Android L.

Podría haber usado el diseño de restricción en lugar del diseño relativo porcentual, pero parece que también hay un problema de desplazamiento. Incluso la vista de desplazamiento personalizada como se sugiere en otras respuestas no me fue útil.

Aunque hay un camino.

Convierta su diseño de porcentaje relativo a diseño relativo y establezca la altura de las vistas mediante programación según la altura de su dispositivo.

Parece que no hay problema en el desplazamiento con diseño relativo. Y puede usar la vista ''Espacio'' para el margen entre vistas de texto. Esta no es una solución muy elegante pero a mi me funcionó.

Código Java:

int height = getWindowManager().getDefaultDisplay().getHeight(); int width = getWindowManager().getDefaultDisplay().getWidth(); // to set height to each textview to 10% of screen textView1.getLayoutParams().height = (int) (height * 0.10); textView2.getLayoutParams().height = (int) (height * 0.10); textView3.getLayoutParams().height = (int) (height * 0.10); textView4.getLayoutParams().height = (int) (height * 0.10); textView5.getLayoutParams().height = (int) (height * 0.10); textView6.getLayoutParams().height = (int) (height * 0.10); // to set width to each textview to 50% of screen textView1.getLayoutParams().width = (int) (width * 0.50); textView2.getLayoutParams().width = (int) (width * 0.50); textView3.getLayoutParams().width = (int) (width * 0.50); textView4.getLayoutParams().width = (int) (width * 0.50); textView5.getLayoutParams().width = (int) (width * 0.50); textView6.getLayoutParams().width = (int) (width * 0.50); // for margin between textviews space1.getLayoutParams().height = (int) (height * 0.10); space2.getLayoutParams().height = (int) (height * 0.10); space3.getLayoutParams().height = (int) (height * 0.10); space4.getLayoutParams().height = (int) (height * 0.10); space5.getLayoutParams().height = (int) (height * 0.10);

Código XML:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/scrollView" android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true"> <RelativeLayout android:id="@+id/scrollContent" android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@android:color/holo_red_dark" android:text="kkjknadko" android:textColor="@android:color/black"/> <android.support.v4.widget.Space android:id="@+id/space1" android:layout_below="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/space1" android:text="Abcaad" android:textColor="@android:color/black"/> <android.support.v4.widget.Space android:id="@+id/space2" android:layout_below="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/space2" android:background="@android:color/holo_red_dark" android:text="Abcd" android:textColor="@android:color/black"/> <android.support.v4.widget.Space android:id="@+id/space3" android:layout_below="@+id/textView3" android:layout_height="wrap_content" android:layout_width="wrap_content" /> <TextView android:id="@+id/textView4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/space3" android:text="Abcd" android:textColor="@android:color/black"/> <android.support.v4.widget.Space android:id="@+id/space4" android:layout_below="@+id/textView4" android:layout_height="wrap_content" android:layout_width="wrap_content" /> <TextView android:id="@+id/textview5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/space4" android:background="@android:color/holo_red_dark" android:text="Abcd" android:textColor="@android:color/black"/> <android.support.v4.widget.Space android:id="@+id/space5" android:layout_below="@+id/textview5" android:layout_height="wrap_content" android:layout_width="wrap_content" /> <TextView android:id="@+id/textview6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/space5" android:text="Abcd" android:textColor="@android:color/black"/> </RelativeLayout>


La pregunta tal como la entiendo es: quiero que estas vistas de texto tengan un ancho del 50% de la vista principal.

La forma en que funciona para mí es:

<Space android:layout_width="20dp" android:layout_height="20dp" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:id="@+id/space" />

Luego, alinee las vistas a eso. Ya sea el RelativeLayout o el TextViews. Pierde el control (si alguna vez lo tuvo) sobre el porcentaje de RelativeLayout. Tiendo a ir con cosas como:

android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium"

¿Esto ayuda?