今天,简单讲讲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的使用就讲完了。
就这么简单。