我动态地将 View 添加到相关布局并以编程方式定义它们。 View 可以在屏幕上移动,因此它们的位置会发生变化。
当我尝试将 View (button2) 设置为位于另一个 View (button1) 下方时,button2 被放置在 button1 的旧位置(在移动之前添加 View 的默认位置)。我已经链接了图片,希望能更好地传达这一点。
这是原始布局
Button2 重新定位后的布局
我有一个后台 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/