根据孩子的身高调整 Horizontal ScrollView 的高度
Adjust HorizontalScrollView height based on childs' height
我有一个 HorizontalScrollView
,我在其中以编程方式添加了 child。滚动视图非常简单:
<HorizontalScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:orientation="horizontal"
android:id="@+id/child_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</LinearLayout>
</HorizontalScrollView>
如前所述,在 child_container
中,我必须以编程方式添加 child 视图。 Child 视图均从此布局中膨胀:
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:padding="@dimen/content_padding"
android:orientation="vertical">
<ImageView
android:layout_width="150dp"
android:layout_height="150dp" />
<TextView
android:id="@+id/text"
style="@style/TextAppearance.AppCompat.Small"
android:singleLine="false"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
问题是 TextView 中的文本可以很小(2 行)或更大,最多 7-8 行。我怎样才能让这个 HorizontalScrollView
根据文本调整它的高度?
在 XML 中,我可以将 android:lines="10"
设置为文本视图,但实际的最大行数可能会改变,我无法对该值进行硬编码。
我在运行时尝试了很多东西,比如请求布局和 re-measuring,但我可能做错了。谢谢。
LinearLayout l = (LinearLayout) findViewById(R.id.child_container);
for (String text : texts) {
View childView = inflater.inflate(...);
TextView textView = childView.findViewById(R.id.text);
textView.setText(text);
l.addView(childView);
}
// Here do something on l
// (or on its parent, the HorizontalScrollView)
// to change its height
将线性布局高度设置为 wrap_content。
我结束了 classing。这是我的外部布局:
<com.app.WrapContentHorizontalScrollView
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</com.app.WrapContentHorizontalScrollView>
这是我的子布局:
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:layout_width="150dp"
android:layout_height="150dp" />
<TextView
android:singleLine="false"
android:layout_width="150dp"
android:layout_weight="1"
android:layout_height="0dp" />
</LinearLayout>
这是我的 class:
public class WrapContentHorizontalScrollView extends HorizontalScrollView {
private LinearLayout directChild;
private int targetHeight;
private final static int UNSPECIFIED = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
public WrapContentHorizontalScrollView(Context context) {
this(context, null);
}
public WrapContentHorizontalScrollView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public WrapContentHorizontalScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
directChild = new LinearLayout(context, attrs, defStyleAttr);
super.addView(directChild);
}
@Override
public void addView(@NonNull View child) {
if (directChild != null) {
directChild.addView(child);
child.measure(UNSPECIFIED, UNSPECIFIED);
targetHeight = Math.max(targetHeight, child.getMeasuredHeight());
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int newHeight = MeasureSpec.makeMeasureSpec(targetHeight, MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, newHeight);
}
}
希望对大家有所帮助。
我有一个 HorizontalScrollView
,我在其中以编程方式添加了 child。滚动视图非常简单:
<HorizontalScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:orientation="horizontal"
android:id="@+id/child_container"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</LinearLayout>
</HorizontalScrollView>
如前所述,在 child_container
中,我必须以编程方式添加 child 视图。 Child 视图均从此布局中膨胀:
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:padding="@dimen/content_padding"
android:orientation="vertical">
<ImageView
android:layout_width="150dp"
android:layout_height="150dp" />
<TextView
android:id="@+id/text"
style="@style/TextAppearance.AppCompat.Small"
android:singleLine="false"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
问题是 TextView 中的文本可以很小(2 行)或更大,最多 7-8 行。我怎样才能让这个 HorizontalScrollView
根据文本调整它的高度?
在 XML 中,我可以将 android:lines="10"
设置为文本视图,但实际的最大行数可能会改变,我无法对该值进行硬编码。
我在运行时尝试了很多东西,比如请求布局和 re-measuring,但我可能做错了。谢谢。
LinearLayout l = (LinearLayout) findViewById(R.id.child_container);
for (String text : texts) {
View childView = inflater.inflate(...);
TextView textView = childView.findViewById(R.id.text);
textView.setText(text);
l.addView(childView);
}
// Here do something on l
// (or on its parent, the HorizontalScrollView)
// to change its height
将线性布局高度设置为 wrap_content。
我结束了 classing。这是我的外部布局:
<com.app.WrapContentHorizontalScrollView
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</com.app.WrapContentHorizontalScrollView>
这是我的子布局:
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:layout_width="150dp"
android:layout_height="150dp" />
<TextView
android:singleLine="false"
android:layout_width="150dp"
android:layout_weight="1"
android:layout_height="0dp" />
</LinearLayout>
这是我的 class:
public class WrapContentHorizontalScrollView extends HorizontalScrollView {
private LinearLayout directChild;
private int targetHeight;
private final static int UNSPECIFIED = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
public WrapContentHorizontalScrollView(Context context) {
this(context, null);
}
public WrapContentHorizontalScrollView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public WrapContentHorizontalScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
directChild = new LinearLayout(context, attrs, defStyleAttr);
super.addView(directChild);
}
@Override
public void addView(@NonNull View child) {
if (directChild != null) {
directChild.addView(child);
child.measure(UNSPECIFIED, UNSPECIFIED);
targetHeight = Math.max(targetHeight, child.getMeasuredHeight());
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int newHeight = MeasureSpec.makeMeasureSpec(targetHeight, MeasureSpec.EXACTLY);
super.onMeasure(widthMeasureSpec, newHeight);
}
}
希望对大家有所帮助。