gpt4 book ai didi

java - 如何在 LinearLayout 中隐藏部分可见的 View ?

转载 作者:行者123 更新时间:2023-11-29 09:08:42 25 4
gpt4 key购买 nike

假设我们有一个简单的 LinearLayout,垂直方向,尺寸宽度:100dp 和高度:100dp

布局内部有 10 个 TextView(宽度:fill_parent,高度:wrap_content,max_lines = 1,scroll_horizo​​ntally = true,ellipsize = end)。每个 TextView 都是可见的,并填充有 14dp 文本“What a text”。 android 设备的最终密度无关紧要。大多数 TextView 将正确显示,但由于强制布局大小,其中一些将不可见或被剪裁。

目标是:检测裁剪 View 并隐藏它们。

我尝试使用自定义 LinearLayout 子类,其中在布局阶段每个 subview 都被测量并与目标大小进行比较。问题是测量调用会更改内部 View 测量值 - 如果 subview 不是简单 View 而是 ViewGroup - 它不会正确显示。据我所知 - 在测量阶段之后 - 应该有布局阶段。但是一切都已经发生在自定义 LinearLayout 的布局阶段。

编辑:

好的,简化我的问题 - 我想要一个 LinearLayout 或一般来说 - 一个 ViewGroup,它不会绘制部分可见的子项。

自定义布局类代码:

public final class ClipAwareLinearLayout extends LinearLayout
{
public ClipAwareLinearLayout(Context context, AttributeSet attrs)
{
super(context, attrs);
}

public ClipAwareLinearLayout(Context context)
{
super(context);
}

@Override
protected void onLayout(boolean changed, int l, int t, int r, int b)
{
super.onLayout(changed, l, t, r, b);
final int width = r - l;
final int height = b - t;
final int count = getChildCount();
final int msWidth = MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST);
final int msHeight = MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST);
View child;
int measuredHeight;
int childHeight;
for (int i = 0; i < count; ++i)
{
child = getChildAt(i);
if (child != null)
{
childHeight = child.getHeight();
child.measure(msWidth, msHeight);
measuredHeight = child.getMeasuredHeight();
final boolean clipped = (childHeight < measuredHeight);
child.setVisibility(clipped ? View.INVISIBLE : View.VISIBLE);
}
}
}

}`

最佳答案

试试下面的代码。它应该可以工作,但我还没有测试过,所以我可能是错的:

class ClippedLinear extends LinearLayout {

public ClippedLinear(Context context, AttributeSet attrs) {
super(context, attrs);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
boolean status = false;
for (int i = getChildCount() - 1; i > 0; i--) {
if (status) {
continue;
}
final View child = getChildAt(i);
final int childHeight = child.getMeasuredHeight();
if (childHeight == 0) {
child.setVisibility(View.GONE);
} else {
child.measure(widthMeasureSpec, heightMeasureSpec);
if (childHeight < child.getMeasuredHeight()) {
child.setVisibility(View.GONE);
}
status = true;
}
}
}

}

关于java - 如何在 LinearLayout 中隐藏部分可见的 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13495194/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com