android - 使用 LayoutParams.addRule 设置动态设置 View 到 View 的最后位置

标签 android android-layout android-relativelayout

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

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

这是原始布局 Original Layout

Button2 重新定位后的布局 Re-positioned Layout

我有一个后台 LinkedList 跟踪布局的所有 View 更改和 View 属性(如果有差异的话)。

代码功能如下:

我如何重新定位 Button1:

Buttons b = (Buttons) viewIndex;
                                positioningLayout = new RelativeLayout.LayoutParams(b.getLayoutParams());
                                positioningLayout.addRule(RelativeLayout.CENTER_VERTICAL);
                                b.setLayoutParams(positioningLayout);
                                baseLayout.addView(b);

在另一个 View 下方重新定位 View 代码 fragment :

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

我如何将 View 添加到布局中。

uiList.addView(new Buttons(this), "BUTTON");
            setDialogView(uiList.getLast());
            showDialog(SET_ID);
            reloadUI();

setDialogView 只是将 View 传递给对话框 SET_ID,这样我就可以手动为 View 分配一个 ID(用于测试)。 reloadUI()只是找到最后添加到后台LinkedList的 View ,并使用.addView将其添加到relativeLayout;

如果您需要更多代码,请告诉我。在对 relativeLayout subview 进行更改后,我是否错过了更新 View 布局的调用?看起来 View 在视觉上正在重新定位,但实际的 LayoutParams 没有更新,所以当您将 Button2 设置为 Button1 时,它正在获得旧位置。

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

最佳答案

我认为您应该尝试简单的解决方案 - 将 b.invalidate() 替换为 b.requestLayout()。更多背景调查 this link .我没有测试它,但我希望它会起作用。所以代码应该是这样的:

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

或者您可以将其简化为:

Buttons b = (Buttons) viewIndex;
((RelativeLayout.LayoutParams) b.getLayoutParams()).addRule(RelativeLayout.BELOW, viewIdFromList.intValue());
b.requestLayout();

关于android - 使用 LayoutParams.addRule 设置动态设置 View 到 View 的最后位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30718795/

相关文章:

Android:当字段可见性更改为 GONE 时更改 XML 中的焦点顺序

java - Android:ScrollView 不使用键盘滚动

android - 开关元素未在分配的空间内水平居中对齐

android - 为什么 main.xml 中默认给出相对布局

Android 将 int 时间戳转换为人类日期时间

android - 为什么属性app :endIconMode is not found in TextInputLayout?

java - 从数组构建列表并允许列表可单击

android - 如何正确显示图像?

android - 使布局可滚动

java - 我怎样才能反序列化这个JSON