2014-10-24 10 views
6

Ho un FrameLayout che carica Fragments toccando le schede in un TabWidget. Non riesco a capire come rendere l'altezza del FrameLayout alta come il suo contenuto, in modo che l'intero contenente ScrollView scorra insieme come uno invece di una vista a scorrimento separata.Come faccio a fare un FrameLayout a riempire l'altezza del suo genitore in modo che l'intera pagina scorra insieme?

Ecco un esempio visivo di struttura tale Fragment s':

enter image description here

Come si può vedere, il layout del frame Visibile Altezza rivela solo una riga del frammento, quando in realtà, ci sono alcuni . Posso scorrere all'interno dello FrameLayout per vedere le altre righe come sono ora, ma non è quello che sto cercando. Il FrameLayout è costituito da un LinearLayout contenente un GridView con il loro layout_height s impostato su wrap_content.

Ho provato a codificare l'altezza dello FrameLayout in qualcosa come 500dp e funziona benissimo tranne per il fatto che non è più dimensionato dinamicamente. Dovrei ridimensionare lo FrameLayout a livello di codice ogni volta che una nuova immagine viene caricata nel contenuto interno? Esiste un attributo di layout che posso impostare in modo che stenda la sua altezza in modo che corrisponda al suo contenuto interno?

Ecco il mio layout di file xml:

<ScrollView 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
> 
<LinearLayout 
    android:orientation="vertical" 

    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 
    <RelativeLayout 
     android:layout_width="fill_parent" 
     android:layout_height="200dp"> 
     <!-- CONTAINS USER INFO AND STATS --> 
    </RelativeLayout> 
    <android.support.v4.app.FragmentTabHost 
     android:id="@android:id/tabhost" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"> 
     <LinearLayout 
      android:orientation="vertical" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:background="#ffffff"> 
      <TabWidget 
       android:id="@android:id/tabs" 
       android:layout_width="fill_parent" 
       android:layout_height="60dp" 
       android:weightSum="2"> 
      </TabWidget> 
      <FrameLayout 
       android:id="@android:id/tabcontent" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       > 
      </FrameLayout> 
     </LinearLayout> 
    </android.support.v4.app.FragmentTabHost> 
</LinearLayout> 
</ScrollView> 

Grazie!


Dal momento che ho intenzione di impostare una taglia su questo, ho pensato di condividere quello che ho capito finora.

Nelle anteprime, onSuccess quando ogni immagine viene caricata, sto chiamando una funzione nel GridLayout che contiene le immagini che conteggiano le immagini e imposta l'altezza dello GridLayout. Funziona bene, anche se sembra che sarebbe un po 'inefficiente.

Quello che sto facendo è impostare l'altezza GridLayout e quindi chiamare requestLayout e invalidate su di esso ed è genitore (s). Funziona, ma non come il caricamento delle immagini. Funzionerà se vado in una scheda diversa e ritorno alle miniature, abbastanza stranamente. Il che mi fa pensare che non sto aggiornando al momento giusto o sull'oggetto giusto.

In ogni caso, quello disse. Qualcuno sa come aumentare l'altezza di un GridLayout espandersi per trattenere il suo contenuto (invece di scorrere) in modo da poter scorrere l'intera pagina (compresa la sezione superiore)?


Vorrei anche aggiungere il layout GridView:

Parent
<GridView 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/grid" 
android:stretchMode="columnWidth" 
android:gravity="center" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:drawSelectorOnTop="false" 
android:fastScrollAlwaysVisible="false" 
android:fastScrollEnabled="false" 
android:numColumns="3" 
android:choiceMode="none"> 
</GridView> 
+0

Mi piace il tuo modo di descrivere il tuo problema (intendo la foto), ottimo lavoro ... – pskink

+0

Ti preghiamo di riconsiderare il layout: non è il modo Android! Ad esempio le schede dovrebbero rimanere in cima. – brescia123

+0

Stai predicando al coro @ brescia123! Sto solo abbinando un design a me dato ~ – Prodikl

risposta

4

Ero in una situazione simile ma avevo un ListView invece di un GridView. Hai ragione nella parte quando devi impostare l'altezza dinamicamente ogni volta che aggiungi un elemento o se chiami notifyDataSetChanged().

Questo codice è PER LISTVIEW AD ALTEZZA diverso per ogni riga

private void setListViewHeightBasedOnChildren(MyQueueAdapter listAdapter) { 

    int desiredWidth = MeasureSpec.makeMeasureSpec(
      mListView.getWidth(), MeasureSpec.AT_MOST); 
    int totalHeight = 0; 

    View view = null; 
    int i; 
    for (i = 0; i < listAdapter.getCount(); i++) { 
     view = listAdapter.getView(i, view, mListView); 

     view.measure(desiredWidth, MeasureSpec.UNSPECIFIED); 

     totalHeight += view.getMeasuredHeight(); 
    } 

    ViewGroup.LayoutParams params = mListView.getLayoutParams(); 
    params.height = heightList 
      + (mListView.getDividerHeight() * (listAdapter 
        .getCount() + 3)); 

    heightListComplete = params.height; 
    mListView.setLayoutParams(params); 

} 

è necessario modificare il codice in base alle vostre esigenze, non è necessario il ciclo come l'altezza di ogni riga è statico nel vostro Astuccio. Se hai bisogno di più aiuto fammi sapere.

ALTERNATIVA

Se si conosce l'altezza della vista in dp è possibile convertire facilmente il dp in px e impostare l'altezza del GridView in base al numero di righe.

+0

Ricordare che questo imporrà l'intero layout (con tutte le righe) da risolvere immediatamente (e tutte le immagini da memorizzare contemporaneamente nella memoria), invece di eseguire il pigro riciclo di righe che altrimenti sarebbe GridView.Un modo per evitare ciò sarebbe utilizzare lo scrolling di 'GridView' aggiungendo il layout superiore come se fosse intestazione, ma ciò richiederebbe tutte le schede contengono un layout 'GridView' (ogni impostazione è proprio' ListAdapter' su 'GridView'). Potrebbero esserci anche altre possibili soluzioni, ma sarebbero molto più complesse da implementare. – corsair992

+0

Sì, ecco perché ho detto che non ha bisogno del ciclo. L'altezza di una sola vista sarà sufficiente e se già conosce l'altezza della riga in dp, può facilmente convertirlo in px e impostare l'altezza della griglia. – Naveen

+0

Sembra che tu non abbia capito il mio commento. Vedi i commenti e la risposta accettata sulla [risposta] (http://stackoverflow.com/questions/3495890/how-can-i-put-a-listview-into-a-scrollview-without-it-collapsing/3495908# 3495908) sembra che tu ne abbia tratto (e che probabilmente dovrebbe essere attribuito alla tua risposta). – corsair992

-1

del layout telaio è il layout lineare la cui altezza è wrap_content. inoltre, l'altezza del framelayout è wrap_content. cambia entrambi in fill_parent. utilizzando match_parent è più preferito ora un giorno insted di fill_parent

+0

Grazie Hirak. Questo non ha cambiato nulla, sfortunatamente. Hai qualche altra idea? – Prodikl

+0

controlla tutti i genitori. il layout lineare ha il suo layout relativo principale con 200dp. quando dici altezza del layout lineare come match_parent, è in realtà 200dp. –

+0

plz dimmi cosa vuoi esattamente. in modo da poterti aiutare secondo il tuo particolare requisito –

2

Quando si utilizzano le dimensioni dinamiche si incontrano problemi una volta inserito match_parent all'interno di una cosa wrap_content. Si cerca di ottenere un piccolo come è contenuto e il contenuto cerca di essere grande quanto genitore. Nessuno dei due saprà come scalare correttamente alla fine.

ScrollView è una cosa che rientra in questa categoria. È una finestra scalabile per il suo contenuto, quindi non può essere wrap_content e il contenuto non può essere match_parent perché è genitore è uno spazio virtuale infinito.

  • Modifica <ScrollView android:layout_height="wrap_content" a match_parent (o una dimensione fissa).

Per risolvere il dimensione del contenuto

  • impostare il layout radice (LinearLayout nel caso) del ScrollView essere una dimensione fissa, in modo che sia contenuto può essere match_parent nuovamente.
  • utilizzare wrap_content fino in fondo.
  • unire i due: wrap_content fino a quando un figlio definisce una dimensione assoluta, quindi match_parent all'interno.

Il percorso wrap_content funziona solo se tutti gli elementi del layout dall'interno all'esterno più espandere correttamente in base al loro contenuto. Nulla può fare affidamento sui limiti del genitore a meno che tu non ne aggiunga qualcuno.

I tuoi contenuti hanno dimensioni piuttosto dinamiche. Quindi è probabile che tu abbia necessario per utilizzare del codice per impostare manualmente le dimensioni in base al contenuto. Per esempio. se quelle immagini all'interno della cornice delle schede sono un GridView (essenzialmente ScrollView con il contenuto della griglia di nuovo) sarà necessario impostarne le dimensioni manualmente. Più di 1 grado di libertà nell'imballaggio dei contenitori dimensionalmente dinamici non è risolvibile automaticamente.

Problemi correlati