Как установить максимальную высоту с содержимым обертки в android?

19

В android, как вы можете создать представление прокрутки, которое имеет максимальную высоту, и обернуть содержимое, в основном оно обертывает содержимое по вертикали, но имеет максимальную высоту?

Я пробовал

<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>

Но это не работает?

    
задан omega 25.08.2013 в 06:39
источник
  • вот еще одно решение проблемы: stackoverflow.com/questions/42694355/... –  user1506104 03.03.2018 в 05:06

5 ответов

21

вы можете добавить это в любое представление (переопределить onMeasure в классе, унаследованном от представления)

@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);
}
    
ответ дан babay 21.03.2015 в 02:49
источник
16

Я расширил ScrollView и добавил код для реализации этой функции:

Ссылка

Я надеюсь, что это будет полезно.

    
ответ дан JMPergar 05.11.2014 в 14:40
источник
  • Эта реализация работает сразу. Единственное, что я хотел бы добавить, это параметр maxHeight в файле / res / values ​​/ attrs.xml, чтобы иметь возможность указать его прямо в XML (developer.android.com/training/custom-views/...) –  DNax 10.02.2015 в 15:53
13

Вы можете сделать это программно.

 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;
    }
}

И добавьте слушателя в представление:

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

Listener вызовет метод onGlobalLayout (), когда высота представления будет изменена.

    
ответ дан harmashalex 20.01.2015 в 10:58
источник
  • Я думаю, что вам нужно удалить пустоту в конструкторе OnViewGlobalLayoutListener (View view). –  Alex 07.06.2016 в 20:25
  • Мне нравится это решение, потому что оно позволяет избежать необходимости в пользовательском классе View и поэтому может применяться к любому типу View. Кстати, сначала это не сработало для меня - мне пришлось изменить способ установки высоты для использования setLayoutParams после изменения LayoutParams, извлеченного из getLayoutParams (как описано в stackoverflow.com/q/2963152/995218). –  atkins 02.05.2018 в 20:15
0

для установки высоты прокрутки вы должны использовать 2 linerlayout внутри вместе, а затем установить scrool view в качестве их потомка, а затем установить средний макет linerlayout: высота для ограничения высоты прокрутки.

    
ответ дан Rasool_sof 28.05.2016 в 17:33
источник
-4

Здесь вы можете установить высоту своего прокрутки, например:

<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>
    
ответ дан Abhishek Birdawade 25.08.2013 в 08:03
источник
  • Конечно не отвечает на вопрос! –  Maverick283 25.02.2016 в 15:23