在API 19之前复制RelativeLayout.LayoutParams的规则

时间:2014-05-15 10:17:11

标签: android android-layout relativelayout

我试图复制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批发的规则,如果没有,那么复制它们的最简单方法是什么?

2 个答案:

答案 0 :(得分:3)

好吧,如果克隆不起作用,可能你的最后一招将是一个很好的“循环”呃。

使用getRules()获取当前LayoutParamsaddRule(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;如果它从未设置过。