我试图复制,我需要新的参数和旧的完全一样。所以考虑一下这个方法:
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.LayoutParams
。我在文档中找不到
RelativeLayout.BELOW
或copyRules()
方法(或任何等效方法),但我可以看到setRules()
的addRule()
方法。考虑到RelativeLayout.LayoutParams
返回一个数组,我想我可以循环这个数组并将每个规则添加到新的layoutparams中,但这感觉我做错了。有没有一种明智的方法来复制这些规则?tl;dr:api 19之前,有没有办法大规模地复制relativelayout.layoutparams的规则,如果没有,最不疯狂的复制方法是什么?
最佳答案
下面是我复制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()
方法的文档:检索所有受支持规则的完整列表,其中索引是规则动词,元素值是指定的值,如果从未设置,则为“false”。