繁体   English   中英

在水平LinearLayout中将垂直线性布局膨胀返回宽度和高度0

[英]Inflating Vertical Linear Layout in Horizontal LinearLayout return width and height 0

我试图在一个自定义水平LinearLayout中将5个垂直LinearLayout膨胀。

首先,我使用LayoutInflater将xml转换为View 然后,我将垂直布局添加到水平布局。

问题是在onMeasure ,我尝试设置子LinearLayout垂直LinearLayout的宽度和高度,但是,当我要求getWidthgetHeight它总是返回0。

我真的不明白这种行为。

你能帮我么。 非常感谢。

垂直LinearLayout的XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#000000" >

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:text="Button"
        android:layout_weight="1" />

    <com.vuric.nativesampler.customviews.BandSeekBar
        android:id="@+id/bandSeek"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="8" 
        android:layout_gravity="center"/>

    <Button
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:text="Button" />

</LinearLayout>

容器水平LinearLayout的类:

public class EqualizerCustomLayout extends LinearLayout {

    private static final int MARGIN = 4;
    private Context context;

    public EqualizerCustomLayout(Context context) {
        super(context);
        this.context = context;
        init();
    }

    public EqualizerCustomLayout(Context context, AttributeSet attrs,
            int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.context = context;
        init();
    }

    public EqualizerCustomLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
        init();
    }

    private void init() {

        setOrientation(LinearLayout.HORIZONTAL);
        setLayoutParams(new LinearLayout.LayoutParams(
                LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

        //getNumberOfBands is 5
        for (int i = 0; i < CustomApplicationClass.get().getNumberOfBands(); ++i) {

            LinearLayout linearLayout = (LinearLayout) inflate(context,
                    R.layout.slot_band_layout, null);

            addView(linearLayout);
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        Log.v("jajaja", "onMeasure children are " + getChildCount());

        int width = (CustomApplicationClass.get().getScreenSize().x / 100 * 45)
                + MARGIN * 2;
        int height = (CustomApplicationClass.get().getScreenSize().x / 100 * 45)
                + MARGIN * 2;

        LayoutParams params = new LinearLayout.LayoutParams(width / 5, width);

        for (int i = 0; i < getChildCount(); ++i) {

            LinearLayout layout = (LinearLayout) getChildAt(i);
            layout.setLayoutParams(new LinearLayout.LayoutParams(width
                    / getChildCount(), height));

            Log.v("jajaja",
                    "view" + i + " , w: " + layout.getWidth() + " , h: "
                            + layout.getHeight()); // always return 0 for both width and height
        }

        setMeasuredDimension(width, height);
    }
}

您必须等到实际绘制视图为止。 有一个解决方法,可以在这里找到。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM