2012-03-23 10 views
10

Ho un layout con un HorizontalScrollView contenente un LinearLayout per un menu in cui i contenuti sono gonfiati con il contenuto del DB. Funziona bene tuttavia quando non ci sono abbastanza elementi per fare lo scroll HSV questo non riempie la larghezza dello schermo che idealmente dovrebbe essere centrata. cioè Attualmente:Center elemets di HorizontalScrollView quando non è sufficiente per farlo scorrere

| Element 1 Element 2       | <- edge of screen 

Anziché:

|  Element 1   Element 2  | <- edge of screen 

pur essendo in grado di:

| Element 1 Element 2 Element 3 Element 4 Elem| <- edge of screen now scrolling 

XML layout è:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/mainLinearLayout" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <TextView 
     android:id="@+id/header" 
     android:layout_width="fill_parent" 
     android:layout_height="25dp" > 
    </TextView> 

    <ScrollView 
     android:id="@+id/scroll1" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="1" > 

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

     </LinearLayout> 
    </ScrollView> 

    <HorizontalScrollView 
     android:id="@+id/horizontalScrollView1" 
     android:layout_width="fill_parent" 
     android:layout_height="30dp"> 

     <LinearLayout 
      android:id="@+id/footerLayout" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:orientation="horizontal" > 

     </LinearLayout> 
    </HorizontalScrollView> 
</LinearLayout> 

Con la seguente XML essere gonfio ed all'interno footerLayout:

<?xml version="1.0" encoding="utf-8"?> 

     <TextView 
      xmlns:android="http://schemas.android.com/apk/res/android" 
      android:id="@+id/footer_content" 
      android:textSize="18sp" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:paddingLeft="5dp" 
      android:paddingRight="5dp" 
      android:text="FOOTER" 
      android:singleLine="true" /> 

Qualsiasi aiuto sarebbe molto apprezzato.

risposta

0

assegnare wieght 1 alla TextView in vista gonfiato e rendere larghezza wrapcontent

+0

non ha alcun effetto, sembra ancora la stessa – Alasdair

+0

sembra che la LinearLayout footerLayout non si espande a riempire l'intera larghezza, se solo uno o due elementi sono all'interno. – Alasdair

+0

prova un'altra cosa potrebbe essere che assegna wieght sum a linearlayout nel tuo codice a qualunque numero di elementi ur inserendo e assegni il wieght 1 in xml al testoView da gonfiare. –

1

riusciti ad aggirare clipping centro-orizzontale sinistra:

HorizontalScrollView parte del layout è stato cambiato in:

<LinearLayout 
    android:id="@+id/footerWrapperLayoutToGetAroundCenteringIssue" 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="50dp" 
    android:gravity="center_horizontal"> 

    <HorizontalScrollView 
     android:id="@+id/horizontalScrollView1" 
     android:layout_height="fill_parent" 
     android:layout_width="wrap_content"> 
     <LinearLayout 
      android:id="@+id/footerLayout" 
      android:orientation="horizontal" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent"> 
     </LinearLayout> 
    </HorizontalScrollView> 
</LinearLayout> 

È solo un peccato quando si concentra su di essi non sono equamente distribuiti.

Se qualcuno ha qualche idea per favore fatemelo sapere.

22

Ho appena risolto questo problema. Mi sono imbattuto in alcune ore fa. È necessario centrare HorizontalScrollView nel suo genitore e impostare la sua larghezza/altezza su wrap_content. Il layout che hai inserito nell'HSV deve avere la sua larghezza/altezza impostata per avvolgere anche il contenuto. La parte importante qui è quella di non impostare alcun gravity/layout_gravity su questo layout o potresti riscontrare (molto fastidiosi) problemi di clipping dopo aver gonfiato le tue visualizzazioni. L'esempio sotto è contenuto in un RelativeLayout.

<HorizontalScrollView android:id="@+id/svExample" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerHorizontal="true" 
    android:layout_below="@id/rlExample"> 
    <LinearLayout 
     android:id="@+id/llExample" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal"> 
    </LinearLayout> 
</HorizontalScrollView > 
+0

Per me ha funzionato correttamente le proprietà: Android: layout_centerHorizontal = "true" android: layout_width = "wrap_content" – GFPF

+0

Grazie uomo, mi hai salvato la giornata. – Ruslan

4

Ho avuto lo stesso problema e alla fine l'ho fatto funzionare. Ecco un esempio minimo:

Il layout attività principale con il HorizontalScrollView:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <HorizontalScrollView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:fillViewport="true" > 

     <LinearLayout 
      android:id="@+id/container" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:orientation="horizontal" > 
     </LinearLayout> 

    </HorizontalScrollView> 

</LinearLayout> 

La disposizione degli elementi che saranno gonfiati e messi all'interno della vista di scorrimento:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:gravity="center_horizontal" 
    android:orientation="horizontal" > 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="your text" /> 

</LinearLayout> 

E questo è un esempio del codice da gonfiare e aggiungere gli elementi:

LinearLayout container = (LinearLayout) findViewById(R.id.container); 
LayoutParams elementLayoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1f); 
int elementCount = 3; // ...or however many you like 
for (int i = 0; i < elementCount; i++) { 
    LinearLayout element = (LinearLayout) getLayoutInflater().inflate(R.layout.element, null); 
    container.addView(element, elementLayoutParams); 
} 

e' s principalmente basato su una tecnica per estendere il contenuto di ScrollViews spiegato in this article by Romain Guy.

Tuttavia, in questo caso in cui si stanno aggiungendo contenuti dinamicamente, un altro punto chiave sta impostando il valore positivo per il peso (1f in questo esempio) utilizzando LayoutParams quando si aggiungono gli elementi al contenitore. Se si dispone di un insieme statico di elementi che è possibile includere direttamente nel contenitore e non hanno bisogno di gonfiare è possibile specificare il peso delle LinearLayout esterno degli elementi nel layout di XML in questo modo:

android:layout_weight="1" 

Ma se lo fai dinamicamente che non funzionerà perché il peso verrà reimpostato su 0 e gli elementi collasseranno. Quindi è necessario impostarlo tramite LayoutParams.

+0

'fillViewport =" true "' era il pezzo mancante che stavo cercando per risolvere il mio problema simile. Per i futuri lettori: se stai sperimentando un ritaglio del lato sinistro davvero strano del 'TextView' centrato all'interno di 'HorizontalScrollView', prova a modificare l'attributo' fillViewport'. Permette di accendere i pesi. –

+0

l'articolo di Romain Guy mi ha aiutato molto –

1

Di seguito è il modo più semplice ha funzionato per me.

<HorizontalScrollView 
    android:id="@+id/horizontalScrollView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="center"> 

    <LinearLayout 
     android:id="@+id/layout_others" 
     android:orientation="horizontal" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"/> 
</HorizontalScrollView> 
Problemi correlati