6

我正在继承 Horizo​​ntalScrollView(这是一个 FrameLayout)并以编程方式向它添加一个 RelativeLayout。

FrameLayout 正确填充父视图,但内部的 RelativeLayout 不显示。

MainActivity::OnCreate()

setContentView(R.layout.activity_main); 
CustomHorizontalScrollView custom = new CustomHorizontalScrollView(this); 
ViewGroup contentView = (ViewGroup) findViewById(R.id.content); 
contentView.addView(custom,new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 180));

CustomHorizo​​ntalScrollView::Constructor()

this.setBackgroundColor(Color.MAGENTA);
relativeLayout = new RelativeLayout(context);
relativeLayout.setBackgroundColor(Color.BLACK);
this.addView(relativeLayout, new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.MATCH_PARENT));

结果:

相对布局未显示

RelativeLayout 应该是黑色的并且应该填充父级,但不是。

奇怪的是,如果我使用 MATCH_PARENT 以像素为单位指定宽度和高度,则会出现 RelativeLayout。

this.addView(relativeLayout, new FrameLayout.LayoutParams(90, 90));

在此处输入图像描述

这是否意味着在以编程方式将 RelativeLayout 添加到 FrameLayout 时我不能使用 MATCH_PARENT?还是我错过了什么?或者也许 Horizo​​ntalScrollView 只支持有一个固定宽度和高度的孩子?

4

1 回答 1

8

我在 Android SDK API Reference 中没有找到严格的信息,但实际上 Horizo​​ntalScrollView 是“用户可以滚动的视图层次结构的布局容器,允许它大于物理显示。”
那么,如果它的唯一子项必须具有相同的宽度,为什么还需要一个 Horizo​​ntalScrollView?
可能,您可以尝试以下方法:

this.addView(relativeLayout, new FrameLayout.LayoutParams(90, FrameLayout.LayoutParams.MATCH_PARENT));

...然后将出现RelativeLayout。
但也许以下内容更有意义:

this.addView(relativeLayout, new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.MATCH_PARENT));

然后,RelativeLayout 将足够大以包含其子项,您可以使用 Horizo​​ntalScrollView 滚动它。
Horizo​​ntalScrollView 具有属性 fillViewport,如果您希望 Horizo​​ntalScrollView “拉伸其内容以填充视口”,您可以将其设置为 true:我认为只有当内容小于 Horizo​​ntalScrollView 时它才有用,但是(我重复一遍) ,如果内容总是比 Horizo​​ntalScrollView 小,那么 Horizo​​ntalScrollView 就没用了。

于 2014-02-16T22:05:42.560 回答