android removeRule的使用

作者: cnbzlj 发布时间: 2019-09-26 浏览: 1899 次 编辑

今天,简单讲讲android里如何使用removeRule去动态改变布局。

最近在修改代码时,发现横竖屏切换时需要动态的设置控件的RelativeLayout.LayoutParams,之前自己是每次切换就new一个RelativeLayout.LayoutParams,但是这样在效率上比较低。所以自己想优化时直接获取控件的RelativeLayout.LayoutParams然后动态的改变属性,这里就需要用到addRule和removeRule了。

不过是要removeRule时却发现了一个问题:removeRule是API 17才加的方法,所以之前的版本不能使用。在网上搜索资料,最终是解决了问题。这里记录一下。

removeRule是API 17才加的方法,为了在API 17前也能使用,可以使用它的等价方法,像上面的例子中的一样,使用addRule(verb, 0)。

关于addRule

RelativeLayout中每一个子控件所应用的规则都是通过数组保存的,如下所示:

public static final int TRUE = -1;
 
public void addRule(int verb) {
    mRules[verb] = TRUE;
    mInitialRules[verb] = TRUE;
    mRulesChanged = true;
}
 
public void addRule(int verb, int anchor) {
    mRules[verb] = anchor;
    mInitialRules[verb] = anchor;
    mRulesChanged = true;
}

以某一规则的索引为下标,值就是规则对应的anchor,如果是相对于另一个子控件,值就是另一个子控件的ID,如果是相对于父控件,值就是`TRUE`,即-1,如果没有应用某一规则值就是0,可以看到,removeRule就是把相应位置的值改为了0:

public void removeRule(int verb) {
    mRules[verb] = 0;
    mInitialRules[verb] = 0;
    mRulesChanged = true;
 }

简单讲讲,其实removeRule和addRule(verb, 0)。在设置控件相对于父控件时的效果是一样的,都是移除控件的RelativeLayout.LayoutParams ,而且removeRule里面也是调用了addRule(verb, 0)的逻辑。所以大家移除属性时,最好使用addRule(verb, 0)。

android removeRule的使用就讲完了。

就这么简单。