15

Ho creato un layout utilizzando uno ScrollView che ha un figlio PercentRelativeLayout. Non funziona su Lollipop e sui dispositivi più vecchi, ma funziona bene su dispositivi Marshmallow. Si prega di verificare il codice qui sotto:PercentRelativeLayout all'interno di ScrollView

<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> 

e anche io android:fillViewport="true", che non mostra nulla di Lollipop e versioni di Android più vecchie.

Sfortunatamente, il layout percentuale non funzionerà con ScrollView prima di M. Il motivo è che dipendono dal suggerimento di dimensioni che viene fornito nel passaggio di misurazione. Prima di M la maggior parte dei layout fornirebbe un suggerimento di dimensione 0 quando si invia una specifica di misura non specificata.

Si può cercare di risolvere il problema che, creando la propria sottoclasse di ScrollView e prioritario measureChild e measureChildWithMargins (per fortuna entrambi sono protetti) per fornire il suggerimento dimensioni.

origine - plus.google.com.

Qualcuno può aiutarmi con la creazione di ScrollView personalizzato per farlo funzionare?

+0

Provare a usare NestScrollView invece di ScrollView. –

+0

l'ho provato ma non funziona –

risposta

0

La domanda, a quanto ho capito, è: voglio che queste viste di testo siano al 50% della larghezza della vista genitore.

modo che funziona per me è:

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

Poi Allinea il View (s) a questo. O il RelativeLayout o le TextView. Si perde il controllo (se lo si è mai avuto) oltre la percentuale del RelativeLayout. Tendo ad andare con cose come:

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

Questo aiuto?

+0

No, in realtà devo fare percentRelativeLayout per lavorare all'interno di scrollview. Ho appena dato l'esempio sopra per mostrare lo scenario non esattamente lo stesso che sto usando –

7

crearne uno personalizzato scrollview e impostare Measured Height e Width come si vuole che per esempio

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 nel vostro 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 > 

enter image description here speranza che questo vi aiuterà.

0

ho incontrato lo stesso problema con Android K e L. Android

Si potrebbe aver usato il layout vincolo al posto di percentuale relativa layout, ma non ci sembra scorrimento problema con quello anche. Anche la vista di scorrimento personalizzata, come suggerito in altre risposte, non mi è stata di aiuto.

Anche se c'è un modo.

Converti il ​​layout percentuale relativo in layout relativo e imposta l'altezza delle viste a livello di codice in base all'altezza del dispositivo.

Non sembra esserci alcun problema nello scorrere con il relativo layout. E puoi usare la vista 'Spazio' per il margine tra TextViews. Questa non è una soluzione molto elegante ma per me ha funzionato.

del codice 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); 

codice 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>