In my xml layouts I have a custom view in which i will put some children like:
<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>
Let me explain a bit more. I wrote a custom ScrollView in which I already have a container defined, for the children. So I just want to put them there.
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 ...
}
What is the way to add Child* to llContainer?
Jin35's answer has a serious problem: getChildCount()
changes value over the iterations because we are removing the children.
This should be a better solution:
while (getChildCount() > 0) {
View v = getChildAt(0);
removeViewAt(0);
llContainer.addView(v);
}
I agree Jin35's answer is flawed. Also, the svContainer is added, so we cannot continue until getChildCount() == 0.
By the end of init(), getChildCount() == 1, since svContainer has been added but the TextViews have not. By the end of onFinishInflate(), the TextViews have been added and should be at positions 1, 2, 3, 4 and 5. But if you then remove the View at position 1, the indices of the others will all decrease by 1 (standard List behaviour).
I would suggest:
@Override
protected void onFinishInflate() {
super.onFinishInflate();
View v;
while ((v = getChildAt(1)) != null) {
removeView(v);
llContainer.addView(v);
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With