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

问题描述 投票:-1回答:2

所以我正在尝试将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);
}
java android android-relativelayout
2个回答
0
投票

也许你应该在添加之前删除breakingNewsLayout

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

0
投票

我想到了!经过广泛的研究和测试,我得到这个问题的原因是因为我在创建新框架时试图重用breakingNewsLayout。我有x个帧,我需要每次想要将布局应用到帧时生成breakingNewsLayout。由于我试图重用我已经添加的布局,因此布局已经有了父级,因此调用了上面的例外。

为这个问题道歉并且缺乏细节。

© www.soinside.com 2019 - 2024. All rights reserved.