2013-03-17 9 views
19

Ho un ViewPager e un ActionBar con schede. Una di queste schede ha un controllo ListView e quando tocco una delle opzioni in quel ListView, aggiungo un frammento figlio che è la vista di dettaglio per quella riga.View in ScrollView non corrisponde a parent come configurato

Questa vista di dettaglio è una ScrollView con un LinearLayout al suo interno. ScrollView è match_parent/match_parent e LinearLayout al suo interno è width=match_parent e height=wrap_content. Su un emulatore di dimensioni del telefono, la vista di dettaglio riempie lo schermo come desiderato, ma su un tablet, la vista di dettaglio copre solo parte della larghezza dello schermo ... anche se la larghezza del ScrollView e la larghezza del LinearLayout sono entrambi match_parent.

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/rootView" style="@style/RootScrollView"> 

    <LinearLayout android:id="@+id/scrollContentView" style="@style/ScrollViewContent"> 
     ... 
    </LinearLayout> 
</ScrollView> 

Qui è lo stile per la vista di scorrimento:

<style name="RootScrollView"> 
    <item name="android:layout_width">match_parent</item> 
    <item name="android:layout_height">match_parent</item> 
</style> 

Qui è lo stile per il LinearLayout contenuti:

<style name="ScrollViewContent"> 
    <item name="android:layout_width">match_parent</item> 
    <item name="android:layout_height">wrap_content</item> 
    <item name="android:paddingLeft">15dp</item> 
    <item name="android:paddingRight">15dp</item> 
    <item name="android:orientation">vertical</item> 
    <item name="android:background">@drawable/image_legal_paper_tile</item> 
</style> 

La vista dei contenuti è uno sfondo ripetuto image_legal_paper_tile che è questo :

<?xml version="1.0" encoding="utf-8"?> 
<bitmap xmlns:android="http://schemas.android.com/apk/res/android" 
    android:src="@drawable/legal_paper_tile" 
    android:gravity="fill_horizontal" 
    android:tileMode="repeat" /> 

Quindi, l'immagine dovrebbe allungarsi orizzontalmente e ripetere che crea un blocco di carta legale giallo sullo sfondo.

Questo è ciò che la lista e la vista di dettaglio assomigliano l'emulatore telefono:

enter image description here

Questo è ciò che la lista e dettaglio vista sguardo come su un vero e proprio tablet. Il frammento di riquadro legale giallo DOVREBBE riempire l'intera larghezza dello schermo, ma non lo è.

enter image description here

EDIT:

Qui è l'immagine di sfondo carta legale:

enter image description here

E '320px di larghezza. L'emulatore del telefono è largo 480 px e l'immagine si allunga correttamente per riempire la larghezza dello schermo. Ripete quindi verticalmente come previsto. Tuttavia, non si estende per riempire la larghezza dello schermo sul tablet.

La larghezza mostrata sul tablet NON è la dimensione nativa dell'immagine, perché modifica le dimensioni in base al contenuto. Quando il frammento viene caricato per la prima volta, è una larghezza. Quindi compilo i campi ed eseguo il calcolo che aggiunge del testo nella parte inferiore della vista del contenuto. Quel testo è più ampio del contenuto esistente e quindi quando il testo viene impostato, la larghezza del frammento aumenta per supportare il contenuto più ampio.

Quindi, in breve, no, la larghezza del tablet non è la dimensione nativa dell'immagine. L'immagine si sta allungando, ma non si estende fino in fondo.

+0

Si sta utilizzando un solo layout per tutte le dimensioni del layout? Quanto è grande la tua immagine di sfondo? La dimensione dell'immagine di sfondo è visibile sul tablet? Quindi può essere un problema di ripetizione delle tessere (per questo forse controllare questo [collegamento] (http://stackoverflow.com/questions/4077487/background-image-not-repeating-in-android-layout)). – abbath

+0

La larghezza mostrata sul tablet NON è la dimensione nativa dell'immagine, perché modifica le dimensioni in base al contenuto. Quando il frammento viene caricato per la prima volta, è una larghezza. Quindi compilo i campi ed eseguo il calcolo che aggiunge del testo nella parte inferiore della vista del contenuto. Quel testo è più ampio del contenuto esistente e quindi quando il testo viene impostato, la larghezza del frammento aumenta per supportare il contenuto più ampio. –

+0

se hai usato il margine di layout nel layout lineare del figlio di scroll, dovresti cambiarlo in padding per funzionare true. –

risposta

68

sul ScrollView utilizzare android:fillViewport="true" e per il bambino di ScrollView android:height="wrap_content". se desideri avere molti figli con attributi diversi, crea un figlio principale come contenitore. impostalo come wrap_content e suo figlio come match_parent.

esempio:

<ScrollView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fillViewport="true"> 

    <LinearLayout 
     android:id="@+id/dynamic_frame" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" > 

     <LinearLayout 
      android:id="@+id/dimrix_sub_child" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical" 
      android:visibility="gone" > 
     </LinearLayout> 

     <LinearLayout 
      android:id="@+id/dimrix_sub_child_21" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:orientation="vertical" 
      android:visibility="gone" > 
     </LinearLayout> 
    </LinearLayout> 
</ScrollView> 

Questo è l'esempio che posso impostare la visibilità nel codice per ogni bambino e lui corrisponderà genitore come si desidera.

+1

L'impostazione fillViewport su true mi ha aiutato nel mio caso. – Scadge

+5

Grazie! Mi hai appena salvato così tante ore! – marienke

+0

prego (-: –

0

Ho trovato una soluzione alternativa, ma non accetterò questa risposta e spero che qualcuno trovi la vera risposta.

Nel mio elenco vista frammento, il gestore onListItemClick(), ho impostato un paio di proprietà (minWidth e minHeight) sul frammento di dettaglio.Quindi nel metodo onCreateView() del frammento di dettaglio, imposto la larghezza e l'altezza minima a quel valore.

Il frammento dettaglio quindi riempie correttamente lo spazio e ancora consente lo scorrimento, ecc

3

Prova ad aggiungere Android: fillViewport = "true" al tuo ScrollView

ricordare che Android: ‘impostare l'altezza all'altezza del genitore’ layout_height =”fill_parent” significa che questo non è, ovviamente, quello che vuoi quando usi un ScrollView. Dopo tutto, ScrollView diventerebbe inutile se il suo contenuto fosse sempre alto come se stesso. Per ovviare a questo, è necessario utilizzare l'attributo ScrollView chiamato android: fillViewport. Se impostato su true, questo attributo fa espandere il figlio della vista di scorrimento all'altezza di ScrollView, se necessario. Quando il bambino è più alto di ScrollView, l'attributo non ha alcun effetto.

Problemi correlati