Android ScrollView set height for displayed content

后端 未结 4 1514
我寻月下人不归
我寻月下人不归 2021-02-19 07:56

I\'m having a lot of trouble trying solve the issue of having a static height scrollable area within a layout. I have three long lists that need to be displayed on the same scre

相关标签:
4条回答
  • 2021-02-19 08:42

    Add a layout around your ScrollView with fixed height

    0 讨论(0)
  • 2021-02-19 08:52

    My simple solution.
    Set ScrollView heigh in xml:

    android:layout_height="wrap_content"
    

    Add this code to set Max Height to 200 if current measured Height is > 200

    sv.measure(0, 0);
    if (nsv.getMeasuredHeight() > 200) {
            LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                                          ViewGroup.LayoutParams.MATCH_PARENT, 200);
            sv.setLayoutParams(lp);
    }
    

    ScrollView in my example is into LinearLayout, so I used LinearLayout.LayoutParams.

    0 讨论(0)
  • 2021-02-19 08:59

    What you need is a maxHeight. But since views do not support it, you have to use a workaround.

    Check out this answer:

    https://stackoverflow.com/a/13811461/770467

    0 讨论(0)
  • 2021-02-19 08:59

    With some help from this answer I managed to wrap up a very basic ScrollView component you can use for this case:

    Create a custom class extending a ScrollView and do the following modifications:

    public class MaxHeightScrollView extends ScrollView {
    
        private int maxHeight;
    
        public MaxHeightScrollView(Context context) {
            super(context);
        }
    
        public MaxHeightScrollView(Context context, AttributeSet attrs) {
            super(context, attrs);
            init(context, attrs);
        }
    
        public MaxHeightScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init(context, attrs);
        }
    
        @TargetApi(Build.VERSION_CODES.LOLLIPOP)
        public MaxHeightScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
            super(context, attrs, defStyleAttr, defStyleRes);
            init(context, attrs);
        }
    
        private void init(Context context, AttributeSet attrs) {
            if (attrs != null) {
                TypedArray styledAttrs = context.obtainStyledAttributes(attrs, R.styleable.MaxHeightScrollView);
                maxHeight = styledAttrs.getDimensionPixelSize(R.styleable.MaxHeightScrollView_maxHeight, 200); //200 is a default value
                styledAttrs.recycle();
            }
        }
    
       @Override
       protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
           heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST);
           super.onMeasure(widthMeasureSpec, heightMeasureSpec);
       }
    }
    

    And then one minor thing left is to declare your styleable in the attrs.xml file of your values folder(If you don't have one, just create an xml file with this name in the values folder of your project's res folder). Add the following lines there:

    <declare-styleable name="MaxHeightScrollView">
        <attr name="maxHeight" format="dimension" />
    </declare-styleable>
    

    And use your new ScrollView as follows:

    <com.yourpackage.MaxHeightScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:maxHeight="300dp">
    </com.yourpackage.MaxHeightScrollView>
    

    Credits go to whizzle for quickly wrapping this up!

    0 讨论(0)
提交回复
热议问题