Android RelativeLayout 动态重置ALIGN_PARENT属性失效问题求助
问题原因
- 复用了全局的
parametersLayoutParams实例:addRule是累加规则而非替换,第一次点击setTop后parameters已经携带ALIGN_PARENT_TOP属性,后续点击setBottom时新增的ALIGN_PARENT_BOTTOM会和原有规则冲突,导致布局异常。 reset变量的赋值逻辑无效:你先给testbox.layoutParams赋值reset,紧接着就赋值为修改后的parameters,reset的设置完全被覆盖,没有起到清除旧规则的作用。
修复方案
你调用removeRule的写法本身没有问题,另外也可以用addRule(规则名称, 0)的方式实现等效的规则移除效果。推荐两种修复方式:
方式1:每次点击时创建新的LayoutParams实例,避免规则累加
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_margins_train) val testbox = findViewById<TextView>(R.id.testbox) val setTop = findViewById<TextView>(R.id.setTop) val setBottom = findViewById<TextView>(R.id.setBottom) setTop.setOnClickListener { // 每次创建新的LayoutParams实例 val params = RelativeLayout.LayoutParams(heightBox.toInt(),widthBox.toInt()) params.addRule(RelativeLayout.CENTER_HORIZONTAL) params.addRule(RelativeLayout.ALIGN_PARENT_TOP) testbox.layoutParams = params } setBottom.setOnClickListener { val params = RelativeLayout.LayoutParams(heightBox.toInt(),widthBox.toInt()) params.addRule(RelativeLayout.CENTER_HORIZONTAL) params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM) testbox.layoutParams = params } }
方式2:以reset为基础修改规则,避免复用旧实例
如果需要保留reset的公共清除逻辑,可以每次基于reset复制新的实例再修改:
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_margins_train) val testbox = findViewById<TextView>(R.id.testbox) val setTop = findViewById<TextView>(R.id.setTop) val setBottom = findViewById<TextView>(R.id.setBottom) val reset = RelativeLayout.LayoutParams(heightBox.toInt(),widthBox.toInt()).apply { removeRule(RelativeLayout.ALIGN_PARENT_END) removeRule(RelativeLayout.ALIGN_PARENT_TOP) removeRule(RelativeLayout.ALIGN_PARENT_BOTTOM) removeRule(RelativeLayout.ALIGN_PARENT_START) removeRule(RelativeLayout.CENTER_HORIZONTAL) removeRule(RelativeLayout.CENTER_VERTICAL) } setTop.setOnClickListener { // 基于reset复制新实例再添加规则 val params = RelativeLayout.LayoutParams(reset) params.addRule(RelativeLayout.CENTER_HORIZONTAL) params.addRule(RelativeLayout.ALIGN_PARENT_TOP) testbox.layoutParams = params } setBottom.setOnClickListener { val params = RelativeLayout.LayoutParams(reset) params.addRule(RelativeLayout.CENTER_HORIZONTAL) params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM) testbox.layoutParams = params } }
内容的提问来源于stack exchange,提问作者Cerber
相关产品推荐
相关产品推荐

