2013-07-16 13 views
6

Sto avendo un sacco di problemi cercando di risolvere il problema di avere un'area di scorrimento statica in un layout. Ho tre lunghi elenchi che devono essere visualizzati sullo stesso schermo e sarebbe del tutto impossibile visualizzare tutte le voci in sequenza, perché se si desidera saltare una categoria è necessario scorrere oltre centinaia di voci.Android ScrollView altezza impostata per il contenuto visualizzato

Suppongo di avere una vista a scorrimento con un layout lineare al suo interno, voglio che questo occupi, ad esempio, un'altezza di 250dp sullo schermo al massimo e sia indipendente da scorrimento una volta popolata con più voci di quelle che possono rientrare nello spazio di 250dp.

Quello che ho ora è:

    <ScrollView 
         android:minWidth="25px" 
         android:minHeight="150px" 
         android:layout_width="fill_parent" 
         android:layout_height="wrap_content" 
         android:id="@+id/XXXXXXX" 
         android:scrollbars="vertical"> 
         <LinearLayout 
          android:orientation="vertical" 
          android:minWidth="25px" 
          android:minHeight="25px" 
          android:layout_width="fill_parent" 
          android:layout_height="wrap_content" 
          android:id="@+id/XXXXXX" /> 
        </ScrollView> 

Quando popolato, lo ScrollView e LinearLayout solo allungare il tempo che ha bisogno di per adattare il contenuto e visualizza tutto questo invece di avere una "finestra" di 250dp/px (qualsiasi misura sarebbe buona) con il contenuto scorrevole all'interno di esso.

Sono nuovo della piattaforma Android, quindi forse la risposta è ovvia e non ho capito la lingua, ma qualsiasi aiuto sarebbe molto apprezzato! Grazie

--- SOLVED: Mettere un lineareLayout al di fuori del ScrollView con l'altezza.

risposta

1

Quello che ti serve è un maxHeight. Ma dal momento che le viste non lo supportano, devi usare una soluzione alternativa.

Partenza questa risposta:

https://stackoverflow.com/a/13811461/770467

+0

ho ottenuto la parte dimensionamento di lavorare con il tuo articolo, ma ora quella zona non è lo scorrimento. Ho aggiornato la domanda con il nuovo codice. Grazie mille! – user2150445

+0

È strano, ho appena eseguito un esempio e scorre perfettamente, ecco il layout: http://pastebin.com/raw.php?i=R45Z7wBi – Androiderson

+0

@ExceptionAl sito web di pasteBin dice "Questa pasta è stata rimossa!" –

9

con qualche aiuto da this risposta sono riuscito a concludere un componente ScrollView molto di base è possibile utilizzare per questo caso:

Creare estensione di una classe personalizzata uno ScrollView e fare le seguenti modifiche:

public class MaxHeightScrollView extends ScrollView { 

    private int maxHeight; 

    public MaxHeightScrollView(Context context) { 
     super(context); 
    } 

    public MaxHeightScrollView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(context, attrs); 
    } 

    public MaxHeightScrollView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(context, attrs); 
    } 

    @TargetApi(Build.VERSION_CODES.LOLLIPOP) 
    public MaxHeightScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
     init(context, attrs); 
    } 

    private void init(Context context, AttributeSet attrs) { 
     if (attrs != null) { 
      TypedArray styledAttrs = context.obtainStyledAttributes(attrs, R.styleable.MaxHeightScrollView); 
      maxHeight = styledAttrs.getDimensionPixelSize(R.styleable.MaxHeightScrollView_maxHeight, 200); //200 is a defualt value 
      styledAttrs.recycle(); 
     } 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST); 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    } 
} 

e poi una cosa minore left è dichiarare il tuo styleable nel file attrs.xml della tua cartella valori (se non ne hai uno, crea semplicemente un file xml con questo nome nella cartella valori della cartella res del tuo progetto). Aggiungere le seguenti righe c'è:

<declare-styleable name="MaxHeightScrollView"> 
    <attr name="maxHeight" format="dimension" /> 
</declare-styleable> 

e utilizzare il nuovo ScrollView come segue:

<com.yourpackage.MaxHeightScrollView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    app:maxHeight="300dp"> 
</com.yourpackage.MaxHeightScrollView> 

crediti vanno a whizzle per avvolgere rapidamente questo in su!

1

La mia soluzione semplice.
Set ScrollView altezza in xml:

android:layout_height="wrap_content" 

aggiungere questo codice per impostare Altezza massima di 200 se corrente misurata altezza è> 200

sv.measure(0, 0); 
if (nsv.getMeasuredHeight() > 200) { 
     LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
             ViewGroup.LayoutParams.MATCH_PARENT, 200); 
     sv.setLayoutParams(lp); 
} 

ScrollView nel mio esempio è in LinearLayout, così Ho usato LinearLayout.LayoutParams.

+0

Grazie mille, questo è proprio quello che stavo cercando. – RobertoAllende

2

Se non mi sbaglio, l'altezza del ViewGroup (altezza del LinearLayout nel tuo caso), che è il (solo) bambino all'interno di uno ScrollView, viene sempre interpretato come wrap_content, dal momento che il contenuto può essere maggiore altezza della ScrollView (quindi le barre di scorrimento).

Ciò significa anche che se il contenuto è più piccolo, il contenuto di ScrollView (figlio) potrebbe non necessariamente allungarsi per riempire lo schermo.

Per aiutarti visivamente a risolvere questo problema, dobbiamo vedere uno screenshot del tuo problema.

Forse impostazione android:fillViewport="true" sul ScrollView risolverà il tuo problema:

<ScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/scrollView1" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fillViewport="true"> 
Problemi correlati