我试图复制RelativeLayout.LayoutParams
,我需要新的Params与旧的Params完全一样。所以考虑这个方法:
private RelativeLayout.LayoutParams copyParams(RelativeLayout.LayoutParams source){
RelativeLayout.LayoutParams copy = new RelativeLayout.LayoutParams((RelativeLayout.LayoutParams)source);
return copy;
}
现在,这样可以正常工作,但它只会在API级别19以上进行编译,因为eclipse会方便地告诉我 为了使这项工作在API-19之前,我尝试了这个:
private RelativeLayout.LayoutParams copyParams(RelativeLayout.LayoutParams source){
RelativeLayout.LayoutParams copy = new RelativeLayout.LayoutParams((ViewGroup.LayoutParams)source);
copy.setMargins(source.leftMargin, source.topMargin, source.rightMargin, source.bottomMargin);
return copy;
}
通过强制转换为ViewGroup.LayoutParams,我可以强制使用ViewGroup.LayoutParams CopyConstructor。它很容易获得,但它只会复制高度和宽度。所以我需要自己转移边距,我在示例2的第3行中进行了转移。但是这仍然排除了源布局中的规则,例如RelativeLayout.BELOW
。
我无法在文档中的任何位置找到copyRules()
或setRules()
方法(或任何等效方法),但我可以看到addRule()
的{{1}}方法。考虑到RelativeLayout.LayoutParams
返回一个数组我认为我可以循环并将每个规则添加到我的新LayoutParams,但这感觉就像我做错了。是否有理智的方式来复制这些规则?
TL; DR:在API 19之前,有没有办法复制RelativeLayout.LayoutParams批发的规则,如果没有,那么复制它们的最简单方法是什么?
答案 0 :(得分:3)
好吧,如果克隆不起作用,可能你的最后一招将是一个很好的“循环”呃。
使用getRules()
获取当前LayoutParams
和addRule(int, int)
中的规则列表,以将其添加到new
LayoutParam。
旧答案:
在这种情况下,我会尝试.clone
。
LayoutParams
一般都是非常简单的对象,只有几个整数,所以.clone
应该很好地处理它。
原始回答:
尝试:
RelativeLayout.LayoutParams copy = new RelativeLayout.LayoutParams((ViewGroup.LayoutParams)source);
自API 1以来,存在ViewGroup.LayoutParams的构造函数。
ps:即使你知道它会编译,我强烈建议你仔细检查所有参数是否被正确复制(不仅仅是高度n边距)
答案 1 :(得分:1)
以下是我使用其所有规则复制RelativeLayout.LayoutParams
所做的工作:
@NonNull
private static RelativeLayout.LayoutParams copy(ViewGroup.LayoutParams viewLayoutParamsToCopy) {
RelativeLayout.LayoutParams copiedParams = new RelativeLayout.LayoutParams(viewLayoutParamsToCopy);
if (viewLayoutParamsToCopy instanceof RelativeLayout.LayoutParams) {
RelativeLayout.LayoutParams relativeLayoutParamsToCopy = (RelativeLayout.LayoutParams) viewLayoutParamsToCopy;
int[] rulesToCopy = relativeLayoutParamsToCopy.getRules();
for (int verb = 0; verb < rulesToCopy.length; verb++) {
int subject = rulesToCopy[verb];
copiedParams.addRule(verb, subject);
}
}
return copiedParams;
}
为了使其工作,我必须仔细阅读getRules()
方法的文档:
检索所有支持规则的完整列表,其中索引是规则谓词,元素值是指定的值,或者&#34; false&#34;如果它从未设置过。