在ConstraintLayout中动态添加TextView无法设置文本左对齐求助
解决ConstraintLayout动态添加TextView文本左对齐无效的问题
我明白你遇到的困扰了——通过代码动态给ConstraintLayout添加TextView时,明明设置了Gravity.LEFT,文本却始终在两条guideline之间居中显示,而XML布局里却能正常左对齐。这大概率是ConstraintLayout对TextView的约束逻辑与宽度设置的组合导致的,下面给你两种可行的解决方案:
方案1:让TextView填充约束范围,内部文本左对齐
当你同时约束TextView的左右到两条guideline时,默认情况下TextView的宽度可能被设为wrap_content,这时ConstraintLayout会把TextView整体居中在两条guideline之间。即便你设置了文本左对齐,也只是在TextView自身的小范围内左对齐,视觉上看起来还是居中。
你需要把TextView的宽度设为MATCH_CONSTRAINT(即0dp),让它填充两条guideline之间的整个空间,再设置文本左对齐:
conLayout.addView(myTextView); // 记得给动态添加的TextView设置唯一ID myTextView.setId(View.generateViewId()); ConstraintSet constraintSet = new ConstraintSet(); constraintSet.clone(conLayout); constraintSet.connect(myTextView.getId(), ConstraintSet.TOP, divider.getId(), ConstraintSet.BOTTOM); constraintSet.connect(myTextView.getId(), ConstraintSet.LEFT, R.id.guideline1, ConstraintSet.LEFT); constraintSet.connect(myTextView.getId(), ConstraintSet.RIGHT, R.id.guideline2, ConstraintSet.LEFT); // 设置宽度为MATCH_CONSTRAINT,填充左右约束空间 constraintSet.constrainWidth(myTextView.getId(), ConstraintSet.MATCH_CONSTRAINT); constraintSet.constrainDefaultHeight(myTextView.getId(), ConstraintSet.WRAP_CONTENT); constraintSet.applyTo(conLayout); // 让文本在TextView内部左对齐 myTextView.setGravity(Gravity.LEFT);
方案2:保持TextView宽度自适应,让View本身靠左对齐
如果你希望TextView宽度只包裹文本内容,同时整体靠左对齐到guideline1,可以设置水平偏移量(bias)为0,强制View在约束范围内靠左:
conLayout.addView(myTextView); // 给动态添加的TextView设置唯一ID myTextView.setId(View.generateViewId()); ConstraintSet constraintSet = new ConstraintSet(); constraintSet.clone(conLayout); constraintSet.connect(myTextView.getId(), ConstraintSet.TOP, divider.getId(), ConstraintSet.BOTTOM); constraintSet.connect(myTextView.getId(), ConstraintSet.LEFT, R.id.guideline1, ConstraintSet.LEFT); constraintSet.connect(myTextView.getId(), ConstraintSet.RIGHT, R.id.guideline2, ConstraintSet.LEFT); // 保持宽度自适应 constraintSet.constrainWidth(myTextView.getId(), ConstraintSet.WRAP_CONTENT); constraintSet.constrainDefaultHeight(myTextView.getId(), ConstraintSet.WRAP_CONTENT); // 设置水平偏移量为0,让View靠左对齐 constraintSet.setHorizontalBias(myTextView.getId(), 0.0f); constraintSet.applyTo(conLayout); // 文本默认就是左对齐,保险起见也可以加上这句 myTextView.setGravity(Gravity.LEFT);
内容的提问来源于stack exchange,提问作者Jahusek
相关产品推荐
相关产品推荐

