在我的xml布局中,我有一个自定义视图,我将在其中放置一些孩子:
<com.proj.layouts.components.ScrollLayout
android:id="@+id/slBody"
android:layout_width="700dp"
android:layout_height="400dp">
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="child1"/>
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="child2"/>
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="child3"/>
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="child4"/>
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="child5"/>
</com.proj.layouts.components.ScrollLayout>
让我再解释一下。我写了一个自定义ScrollView,我已经为孩子们定义了一个容器。所以我只想把它们放在那里。
public class ScrollLayout extends LinearLayout {
// View responsible for the scrolling
private FrameLayout svContainer;
// View holding all of the children
private LinearLayout llContainer;
public ScrollLayout(Context context) {
super(context);
init();
}
public ScrollLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
private void init() {
super.removeAllViews(); // kill old containers
svContainer = new HorizontalScroll(getContext());
llContainer = new LinearLayout(getContext());
llContainer.setOrientation(orientation);
svContainer.addView(llContainer);
svContainer.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
llContainer.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
addView(svContainer);
}
... I left out the part which takes care of the scroll event ...
}
将Child *添加到llContainer的方法是什么?
答案 0 :(得分:11)
为什么不将所有孩子都添加到LinearLayout
的{{1}}?这应该在ScrollLayout
方法中完成。
onFinishInflate()
在XML文件中编写结构时 - 所有内部视图都是自定义布局的子视图。只需将其替换为for (int i = 0; i<getChildCount(); i++)
{
View v = getChildAt(i);
removeViewAt(i);
llContainer.addView(v);
}
。
答案 1 :(得分:7)
Jin35的答案有一个严重的问题:getChildCount()
会改变迭代的值,因为我们正在移除子项。
这应该是一个更好的解决方案:
while (getChildCount() > 0) {
View v = getChildAt(0);
removeViewAt(0);
llContainer.addView(v);
}
答案 2 :(得分:4)
我同意Jin35的答案存在缺陷。此外,添加了svContainer,因此在getChildCount()== 0之前我们无法继续。
在init()结束时,getChildCount()== 1,因为已经添加了svContainer但TextViews没有添加。 在onFinishInflate()结束时,TextViews已被添加,并且应该位于1,2,3,4和5位。但是如果你随后删除位置1的View,其他的索引将全部减少1(标准列表行为)。
我建议:
@Override
protected void onFinishInflate() {
super.onFinishInflate();
View v;
while ((v = getChildAt(1)) != null) {
removeView(v);
llContainer.addView(v);
}
}