我试图复制,我需要新的参数和旧的完全一样。所以考虑一下这个方法:

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.BELOWcopyRules()方法(或任何等效方法),但我可以看到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”。

10-07 19:20
查看更多