问题
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?
回答1:
Why don't you just add all the children to the LinearLayout
from your ScrollLayout
? This should be done in the onFinishInflate()
method.
for (int i = 0; i<getChildCount(); i++)
{
View v = getChildAt(i);
removeViewAt(i);
llContainer.addView(v);
}
When you write your structure in the XML file - all inner views are children of your custom layout. Just replace it to LinearLayout
.
回答2:
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);
}
回答3:
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);
}
}
来源:https://stackoverflow.com/questions/9258732/android-how-to-add-children-from-an-xml-layout-into-a-custom-view