无法以编程方式将RelativeLayout添加到RelativeLayout

时间:2018-07-17 01:23:18

标签: java android android-relativelayout

所以我试图将RelativeLayout添加到RelativeLayout中,但是,当我运行我的应用程序时,这是一个IllegalStateException,它显示此错误:指定的子代已经有一个父代。您必须先在孩子的父母上调用removeView()。我敢肯定,你们以前都看过。我的问题是如何正确地将两个相对布局嵌套在一起?

以下是产生异常的代码段:

    RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT);
    RelativeLayout newFrame = new RelativeLayout(vidRipperService.getBaseContext());
    newFrame.setLayoutParams(layoutParams);

    // configure image view constraints...
    // have the frame be right in the center of the layout.
    ImageView editedFrame = new ImageView(vidRipperService.getBaseContext());
    // Note: when doing padding the height and the width must be a multiple of two. A nice example is 70+30 = 100/2 = 50, but 80+30 = 110/2 = 55 <- not a multiple of two. Keep this in mind.
    editedFrame.setId(View.generateViewId());
    editedFrame.setPadding(30,30,30,0); // padding of 30 around the whole view.
    editedFrame.setImageBitmap(frame); // set the frame to be that of the actual background.
    RelativeLayout.LayoutParams frameLayoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
    frameLayoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL); // place frames in center of the view.

    editedFrame.setLayoutParams(frameLayoutParams);

    newFrame.addView(breakingNewsLayout); // add the breaking news layout to this view!
    newFrame.addView(editedFrame);

问题是从第二行到最后一行特别触发的。 newFrame.addView(breakingNewsLayout)该行触发异常。 BreakingNewsLayout是我要添加到newFrame的另一个相对布局。我将不胜感激如何使它起作用。以前嵌套布局时,我从来没有遇到过问题,但是由于某种原因,这确实玩得不好。

以下是创建BreakingNewsLayout的代码:

private void createBreakingNewsLayout()
{
    breakingNewsLayout = new RelativeLayout(vidRipperService.getBaseContext()); // create the new breaking new layout.
    breakingNewsLayout.setElevation(5);
    breakingNewsLayout.setPadding(0,0,0,15);
    breakingNewsLayout.setBackgroundColor(ContextCompat.getColor(vidRipperService, R.color.transparent)); // ensure that the background is transparent.

    // MATCH_PARENT for both width and height so that banner is shown on the frame for the video.
    RelativeLayout.LayoutParams breakingNewsParams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    breakingNewsParams.setMargins(0,50,0,0); // todo: ensure that the margin is 50dp not pixels!
    breakingNewsParams.addRule(RelativeLayout.CENTER_HORIZONTAL);

    breakingNewsLayout.setLayoutParams(breakingNewsParams); // set the layout params for the breaking news layout.

    // set all of the text view attributes.
    TextView liveBannerText = getLiveBannerText();
    TextView breakingNewsTime = getBreakingNewsTime();
    TextView breakingNewsHeadline = getBreakingNewsHeadline(breakingNewsTime.getId()); // headline goes about the breaking news time.
    TextView breakingNewsBanner = getBreakingNewsBanner(breakingNewsHeadline.getId()); // banner goes above the breaking news headline
    TextView viddyWatermarkText = getViddyWatermarkText(breakingNewsHeadline.getId()); // viddy watermark goes above the breaking news headline.
    TextView breakingNewsDescription = getBreakingNewsDescription(breakingNewsTime.getId()); // breaking news description goes to the end of the breaking news time

    // Add all of the views for the breaking news layout.
    breakingNewsLayout.addView(liveBannerText);
    breakingNewsLayout.addView(breakingNewsBanner);
    breakingNewsLayout.addView(viddyWatermarkText);
    breakingNewsLayout.addView(breakingNewsHeadline);
    breakingNewsLayout.addView(breakingNewsTime);
    breakingNewsLayout.addView(breakingNewsDescription);
}

2 个答案:

答案 0 :(得分:0)

也许您应该在添加breakingNewsLayout之前将其删除:

((ViewGroup) breakingNewsLayout.getParent()).removeView(breakingNewsLayout);

答案 1 :(得分:0)

我知道了!经过广泛的研究和测试,导致出现此问题的原因是因为我试图在创建新框架时重用BreakingNewsLayout。我有x帧,我想每次将布局应用于帧时都需要生成BreakingNewsLayout。由于我试图重用已经添加的布局,因此该布局已经具有父级,因此调用了上面的异常。

对于这个问题和缺乏细节的歉意。