在FrameLayout内的相对布局中创建和添加动态视图

时间:2014-05-06 11:30:17

标签: android android-layout layoutparams

我正在做的事情是这样的

<Dynamic Framelayout >
    <Dynamic Relaive Layout>

       <Dynamic imageView>
       <Dynamic TextView>

    </Dynamic Relaive Layout>
</Dynamic Framelayout>

我已经创建了布局并按照上面的讨论放置了视图。

但是现在我想将textview放在图片视图下方

这是我得到的。

enter image description here

注意RED textviews。这应该在图像视图下方并水平居中。

这是我的代码。

final FrameLayout main = (FrameLayout) findViewById(R.id.add_dynamic_views_frame);
int numViews = drawbbleIds.length;
for (int i = 0; i < numViews; i++) {

    RelativeLayout rel_inner = new RelativeLayout(SplashSearch.this);

    rel_inner.setGravity(Gravity.CENTER_HORIZONTAL);

    ImageView imgView = new ImageView(SplashSearch.this);

    TextView textView = new TextView(SplashSearch.this);

    imgView.setImageDrawable(getResources().getDrawable(drawbbleIds[i]));

    imgView.setTag(i);
    imgView.setId(i);
    imgView.setOnClickListener(SplashSearch.this);

    rel_inner.addView(imgView);

    RelativeLayout.LayoutParams imgLp = (RelativeLayout.LayoutParams) imgView
            .getLayoutParams();

    textView.setTag(i);
    textView.setId(i);

    textView.setText(getResources().getStringArray(R.array.tabs_names)[i]);

    textView.setTextColor(Color.RED);

    rel_inner.addView(textView);

    RelativeLayout.LayoutParams txtLp = (RelativeLayout.LayoutParams) textView
            .getLayoutParams();

    imgLp.addRule(RelativeLayout.BELOW, textView.getId());

    textView.setLayoutParams(imgLp);

    FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(70, 70);

    // Place all views in the center of the
    // layout. We'll transform them
    // away from there in the code below.
    lp.gravity = Gravity.CENTER;

    // Set layout params on view.
    rel_inner.setLayoutParams(lp);

    // Calculate the angle of the current
    // view.
    // Adjust by 90 degrees to
    // get View 0 at the top. We need the
    // angle
    // in degrees and radians.
    float angleDeg = i * 360.0f / numViews - 90.0f;
    float angleRad = (float) (angleDeg * Math.PI / 180.0f);

    rel_inner.setTranslationX(250 * (float) Math.cos(angleRad));
    rel_inner.setTranslationY(250 * (float) Math.sin(angleRad));

    main.addView(rel_inner);
}

3 个答案:

答案 0 :(得分:2)

尝试使用此代码:

 final FrameLayout main = (FrameLayout) findViewById(R.id.frame);
            int numViews = 5;
            for (int i = 0; i < numViews; i++) {

                RelativeLayout rel_inner = new RelativeLayout(this);

                rel_inner.setGravity(Gravity.CENTER_HORIZONTAL);

                ImageView imgView = new ImageView(this);

                imgView.setImageDrawable(getResources().getDrawable(
                        R.drawable.ic_launcher));

                imgView.setTag(i);
                imgView.setId(i + 1);
                // imgView.setOnClickListener(SplashSearch.this);

                rel_inner.addView(imgView);

                RelativeLayout.LayoutParams imgLp = new RelativeLayout.LayoutParams(
                        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

                TextView textView = new TextView(this);
                textView.setTag(i);
                textView.setId(i);
                textView.setText("" + i);

                textView.setTextColor(Color.RED);
                imgLp.addRule(RelativeLayout.BELOW, imgView.getId());
imgLp.addRule(RelativeLayout.CENTER_HORIZONTAL);
                textView.setLayoutParams(imgLp);

                rel_inner.addView(textView);

                FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(70,
                        LayoutParams.WRAP_CONTENT);

                // Place all views in the center of the
                // layout. We'll transform them
                // away from there in the code below.
                lp.gravity = Gravity.CENTER;

                // Set layout params on view.
                rel_inner.setLayoutParams(lp);

                // Calculate the angle of the current
                // view.
                // Adjust by 90 degrees to
                // get View 0 at the top. We need the
                // angle
                // in degrees and radians.
                float angleDeg = i * 360.0f / numViews - 90.0f;
                float angleRad = (float) (angleDeg * Math.PI / 180.0f);

                rel_inner.setTranslationX(250 * (float) Math.cos(angleRad));
                rel_inner.setTranslationY(250 * (float) Math.sin(angleRad));

                main.addView(rel_inner);
            }

效果很好。希望它可以帮到你。

答案 1 :(得分:1)

将视图添加到RelativeLayout后,您正在设置LayoutParams

textView.setLayoutParams(imgLp);

首先如上所述设置LayoutParams,然后将Views添加到RelativeLayout。

rel_inner.addView(imgView);
rel_inner.addView(textView);

修改:尝试复制粘贴此代码。我无法测试,因为我没有资源,文件等,但这应该可以解决问题。

    final FrameLayout main = (FrameLayout) findViewById(R.id.add_dynamic_views_frame);
    int numViews = drawbbleIds.length;
    for (int i = 0; i < numViews; i++) {

        RelativeLayout rel_inner = new RelativeLayout(SplashSearch.this);

        FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(70, 70);

        // Place all views in the center of the
        // layout. We'll transform them
        // away from there in the code below.
        lp.gravity = Gravity.CENTER;

        // Set layout params on view.
        rel_inner.setLayoutParams(lp);

        ImageView imgView = new ImageView(SplashSearch.this);

        TextView textView = new TextView(SplashSearch.this);

        imgView.setImageDrawable(getResources().getDrawable(drawbbleIds[i]));

        imgView.setTag(i);
        imgView.setId(i);
        imgView.setOnClickListener(SplashSearch.this);

        RelativeLayout.LayoutParams imgLp = (RelativeLayout.LayoutParams) imgView
                .getLayoutParams();

        imgLp.addRule(RelativeLayout.CENTER_HORIZONTAL);
        imgView.setLayoutParams(imgLp);

        rel_inner.addView(imgView);

        textView.setTag(i);
        textView.setId(i);

        textView.setText(getResources().getStringArray(R.array.tabs_names)[i]);

        textView.setTextColor(Color.RED);

        RelativeLayout.LayoutParams txtLp = (RelativeLayout.LayoutParams) textView
                .getLayoutParams();

        txtLp.addRule(RelativeLayout.CENTER_HORIZONTAL);
        txtLp.addRule(RelativeLayout.BELOW, imgView.getId());
        textView.setGravity(Gravity.CENTER);
        textView.setLayoutParams(txtLp);

        rel_inner.addView(textView);

        // Calculate the angle of the current
        // view.
        // Adjust by 90 degrees to
        // get View 0 at the top. We need the
        // angle
        // in degrees and radians.
        float angleDeg = i * 360.0f / numViews - 90.0f;
        float angleRad = (float) (angleDeg * Math.PI / 180.0f);

        rel_inner.setTranslationX(250 * (float) Math.cos(angleRad));
        rel_inner.setTranslationY(250 * (float) Math.sin(angleRad));

        main.addView(rel_inner);
    }

答案 2 :(得分:-2)

在此使用LinearLayout代替RelativeLayout