如何在android中设置带有包装内容的最大高度?

Posted

技术标签:

【中文标题】如何在android中设置带有包装内容的最大高度?【英文标题】:How to set a maximum height with wrap content in android? 【发布时间】:2013-08-27 20:36:14 【问题描述】:

android中,如何创建一个具有最大高度的滚动视图并包裹内容,基本上它垂直包裹内容,但具有最大高度?

我试过了

<ScrollView 
     android:id="@+id/scrollView1"
     android:layout_
     android:layout_
         android:maxHeight="200dp"
     android:layout_alignParentBottom="true" >

    <LinearLayout
        android:id="@+id/maincontainer"
        android:layout_
        android:layout_
        android:orientation="vertical">

    </LinearLayout>
</ScrollView>

但这不起作用?

【问题讨论】:

这里有另一个解决问题的方法:***.com/questions/42694355/… 【参考方案1】:

您可以将此添加到任何视图(在从视图继承的类中覆盖 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);

【讨论】:

这个怎么用? @c- 扩展某个视图类,重写该类的onMeasure方法。【参考方案2】:

我已经扩展了 ScrollView 并添加了代码来实现这个功能:

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

希望对你有用。

【讨论】:

此实现立即生效。我唯一要添加的是 /res/values/attrs.xml 文件中的 maxHeight 参数,以便能够在 XML 中正确指定它 (developer.android.com/training/custom-views/…)【参考方案3】:

您可以通过编程方式完成。

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

监听器会调用 onGlobalLayout() 方法,当视图高度发生变化时。

【讨论】:

我认为您需要删除 void 上的 OnViewGlobalLayoutListener(View view) 构造函数。 我喜欢这个解决方案,因为它避免了对自定义 View 类的需求,因此可以应用于任何 View 类型。顺便说一句,它起初对我不起作用 - 在修改从 getLayoutParams 检索到的 LayoutParams 后,我必须修改设置高度的方式以使用 setLayoutParams(如 ***.com/q/2963152/995218 所述)。 【参考方案4】:

可以通过将视图包装到ConstraintLayout 并使用layout_constraintHeight_max 属性来完成。

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_
    android:layout_>

    <ScrollView
        android:layout_
        android:layout_
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHeight_max="wrap"
        app:layout_constraintVertical_bias="0">

        ...

    </ScrollView>

</androidx.constraintlayout.widget.ConstraintLayout>

在上面的示例中,父级ConstraintLayout 的高度被限制为200dp,而子级ScrollView 的高度将内容包裹起来,直到它小于200dp。注意app:layout_constraintVertical_bias="0"将子ScrollView对齐在父元素的顶部,否则会居中。

【讨论】:

这符合我的要求,谢谢@Valeriy katkov【参考方案5】:

要设置滚动视图高度,您必须在里面一起使用 2 个 linerlayout,然后将 scrool 视图设置为它们的子视图,然后设置中间 linerlayout 布局:限制滚动视图高度的高度。

【讨论】:

【参考方案6】:

1.) 创建一个类来处理将最大高度设置为用户传递的内容:

public class OnViewGlobalLayoutListener implements ViewTreeObserver.OnGlobalLayoutListener 


private Context context;
private int maxHeight;
private View view;

public OnViewGlobalLayoutListener(View view, int maxHeight, Context context) 
    this.context = context;
    this.view = view;
    this.maxHeight = dpToPx(maxHeight);


@Override
public void onGlobalLayout() 
    if (view.getHeight() > maxHeight) 
        ViewGroup.LayoutParams params = view.getLayoutParams();
        params.height = maxHeight;
        view.setLayoutParams(params);
    


public int pxToDp(int px) 
    DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
    int dp = Math.round(px / (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
    return dp;


public int dpToPx(int dp) 
    DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
    int px = Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
    return px;


2.) 将此附加到视图并在 DP 中传递最大高度:

messageBody.getViewTreeObserver()
            .addOnGlobalLayoutListener(
             new OnViewGlobalLayoutListener(messageBody, 256, context)
             );

感谢@harmashalex 的启发。我进行了修改,因为@harma 的代码无法设置布局参数。此外,dp 到 px 的转换对于减轻对它的疑惑是必要的。

【讨论】:

【参考方案7】:

在这里您可以像这样设置 Scrollview 的高度 -:

<ScrollView 
 android:id="@+id/scrollView1"
 android:layout_
 android:layout_
 android:layout_alignParentBottom="true" >

           <LinearLayout
            android:id="@+id/maincontainer"
            android:layout_
            android:layout_
            android:orientation="vertical">

           </LinearLayout>
</ScrollView>

【讨论】:

肯定没有回答问题!

以上是关于如何在android中设置带有包装内容的最大高度?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 nativescript 中设置最大高度?

CSS:如何在数据列表中设置最大高度?

如何在 Android DatePicker 中设置最小和最大日期?

如何在 React Native Android 中设置按钮的高度

如何在 Kivy 中设置小部件/布局的最小允许宽度/高度?

Android:如何在 android constraintLayout 中设置视图的最大宽度?