使用LayoutParams.addRule设置动态设置视图到视图的最后位置

Sev*_*ros 5 android android-layout android-relativelayout

我正在动态地将视图添加到相对布局并以编程方式定义它们.视图可以在屏幕上移动,因此它们的位置会发生变化.

当我尝试将视图(button2)设置为位于另一个视图(button1)下方时,button2将被放置在button1的旧位置(在移动之前添加视图的默认位置).我已经链接了图像,希望能更好地传达这一点.

这是原始布局 原始布局

Button2重新定位后的布局重新定位布局

我有一个后台LinkedList跟踪所有视图更改和布局的视图属性,如果这有所不同.

以下是代码函数:

我如何重新定位Button1:

Buttons b = (Buttons) viewIndex;
                                positioningLayout = new RelativeLayout.LayoutParams(b.getLayoutParams());
                                positioningLayout.addRule(RelativeLayout.CENTER_VERTICAL);
                                b.setLayoutParams(positioningLayout);
                                baseLayout.addView(b);
Run Code Online (Sandbox Code Playgroud)

在另一个视图下方重新定位视图代码片段:

Buttons b = (Buttons) viewIndex;
                                positioningLayout = new RelativeLayout.LayoutParams(b.getLayoutParams());
                                positioningLayout.addRule(RelativeLayout.BELOW, viewIdFromList.intValue());
                                b.setLayoutParams(positioningLayout);
                                b.invalidate();
Run Code Online (Sandbox Code Playgroud)

我如何将视图添加到布局中.

uiList.addView(new Buttons(this), "BUTTON");
            setDialogView(uiList.getLast());
            showDialog(SET_ID);
            reloadUI();
Run Code Online (Sandbox Code Playgroud)

setDialogView只是将视图传递给Dialog SET_ID,以便我可以手动为视图分配ID(用于测试).reloadUI()只是找到添加到后台LinkedList的最后一个视图,并使用.addView将它添加到relativeLayout;

如果您需要更多代码,请告诉我们.在更改relativeLayout子视图后,我是否错过了更新视图布局的调用?似乎视图在视觉上重新定位,但实际的LayoutParams没有更新,因此当您将Button2设置为Button1时,它将获得旧位置.

有没有办法强制相对布局视图重新定位?

rom*_*4ek 4

我认为你应该尝试简单的解决方案 - 替换b.invalidate()为b.requestLayout(). 有关更多背景信息,请查看此链接。我没有测试过,但我希望它能起作用。所以代码应该是这样的:

Buttons b = (Buttons) viewIndex;
positioningLayout = new RelativeLayout.LayoutParams(b.getLayoutParams());
positioningLayout.addRule(RelativeLayout.BELOW, viewIdFromList.intValue());
b.setLayoutParams(positioningLayout);
b.requestLayout();
Run Code Online (Sandbox Code Playgroud)

或者您可以将其简化为:

Buttons b = (Buttons) viewIndex;
((RelativeLayout.LayoutParams) b.getLayoutParams()).addRule(RelativeLayout.BELOW, viewIdFromList.intValue());
b.requestLayout();
Run Code Online (Sandbox Code Playgroud)