2013-08-25 14 views
18

W Androidzie, w jaki sposób można utworzyć widok przewijania, który ma maksymalną wysokość i zawijać zawartość, w zasadzie zawija zawartość w pionie, ale ma maksymalną wysokość?Jak ustawić maksymalną wysokość z zawartością zawijania w systemie Android?

Próbowałem

<ScrollView 
    android:id="@+id/scrollView1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
     android:maxHeight="200dp" 
    android:layout_alignParentBottom="true" > 

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

    </LinearLayout> 
</ScrollView> 

Ale to nie działa?

+0

tutaj jest inne rozwiązanie problemu: https://stackoverflow.com/questions/42694355/how-to-set-recyclerview-max-height/48970129#48970129 – user1506104

Odpowiedz

-4

Tutaj można ustawić wysokość swojej Scrollview jak ta -:

<ScrollView 
android:id="@+id/scrollView1" 
android:layout_width="match_parent" 
android:layout_height="200dp" 
android:layout_alignParentBottom="true" > 

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

      </LinearLayout> 
</ScrollView> 
+0

Z pewnością nie odpowiada na pytanie! – Maverick283

16

mam przedłużony Scrollview i kod dodany do wdrożenia tej funkcji:

https://gist.github.com/JMPergar/439aaa3249fa184c7c0c

Mam nadzieję, że być użyteczne .

+1

Ta implementacja działa od razu. Dodam tylko parametr maxHeight w pliku/res/values ​​/ attrs.xml, aby móc go dokładnie określić w XML (http://developer.android.com/training/custom-views/create -view.html # customattr) – DNax

11

Możesz to zrobić programowo.

private static class OnViewGlobalLayoutListener implements ViewTreeObserver.OnGlobalLayoutListener { 
    private final static int maxHeight = 130; 
    private View view; 

    public OnViewGlobalLayoutListener(View view) { 
     this.view = view; 
    } 

    @Override 
    public void onGlobalLayout() { 
     if (view.getHeight() > maxHeight) 
      view.getLayoutParams().height = maxHeight; 
    } 
} 

I dodać słuchacza do widoku:

view.getViewTreeObserver() 
        .addOnGlobalLayoutListener(new OnViewGlobalLayoutListener(view)); 

słuchacz wywołać metodę onGlobalLayout(), gdy widok wysokość zostanie zmieniona.

+0

Myślę, że musisz usunąć 'void' na swoim konstruktorze' OnViewGlobalLayoutListener (View view) '. – Alex

20

można dodać do dowolnego widoku (sterowanie onMeasure w klasie dziedziczone z widzenia)

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    if (maxHeight > 0){ 
     int hSize = MeasureSpec.getSize(heightMeasureSpec); 
     int hMode = MeasureSpec.getMode(heightMeasureSpec); 

     switch (hMode){ 
      case MeasureSpec.AT_MOST: 
       heightMeasureSpec = MeasureSpec.makeMeasureSpec(Math.min(hSize, maxHeight), MeasureSpec.AT_MOST); 
       break; 
      case MeasureSpec.UNSPECIFIED: 
       heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST); 
       break; 
      case MeasureSpec.EXACTLY: 
       heightMeasureSpec = MeasureSpec.makeMeasureSpec(Math.min(hSize, maxHeight), MeasureSpec.EXACTLY); 
       break; 
     } 
    } 

    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
} 
+0

Działa. Lubić. Urok. –

+0

Dziękujemy! działa – Leon

+0

Jeśli działa idealnie. Dziękuję bardzo! – Duyhungws

0

wysokości zestaw Scrollview trzeba użyć 2 linerlayout wewnątrz razem, a następnie ustawić widok scrool jak ich dziecko ustaw środkowy układ linerlayout: wysokość dla limitu wysokości przewijania.