android - 如何在同一个 ConstraintLayout 中为不同的 TextView 使用单独的 ConstraintSet 操作?
问题描述
我的问题来自这个问题:Android:如何以编程方式设置 layout_constraintRight_toRightOf "parent"。
我编写了以下代码,应该将新的 TextView 约束到 ConstraintLayout 的左侧 (btnSendL) 或右侧 (btnSendR)。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ConstraintLayout clMessagesContainer = (ConstraintLayout) findViewById(R.id.clMessagesContainer);
final EditText txtMessage = (EditText) findViewById(R.id.txtMessage);
Button btnSendL = (Button) findViewById(R.id.btnSendL);
Button btnSendR = (Button) findViewById(R.id.btnSendR);
btnSendL.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
TextView lblNxtMessage = new TextView(MainActivity.this);
lblNxtMessage.setLayoutParams(new ConstraintLayout.LayoutParams(
ConstraintLayout.LayoutParams.WRAP_CONTENT,
ConstraintLayout.LayoutParams.WRAP_CONTENT));
lblNxtMessage.setText(txtMessage.getText().toString());
clMessagesContainer.addView(lblNxtMessage);
ConstraintSet csL = new ConstraintSet();
csL.clone(clMessagesContainer);
csL.connect(lblNxtMessage.getId(), ConstraintSet.LEFT, ConstraintSet.PARENT_ID, ConstraintSet.LEFT, 0);
csL.connect(lblNxtMessage.getId(), ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP, 0);
csL.applyTo(clMessagesContainer);
}
});
btnSendR.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
TextView lblNxtMessage = new TextView(MainActivity.this);
lblNxtMessage.setLayoutParams(new ConstraintLayout.LayoutParams(
ConstraintLayout.LayoutParams.WRAP_CONTENT,
ConstraintLayout.LayoutParams.WRAP_CONTENT));
lblNxtMessage.setText(txtMessage.getText().toString());
clMessagesContainer.addView(lblNxtMessage);
ConstraintSet csR = new ConstraintSet();
csR.clone(clMessagesContainer);
csR.connect(lblNxtMessage.getId(), ConstraintSet.RIGHT, ConstraintSet.PARENT_ID, ConstraintSet.RIGHT, 0);
csR.connect(lblNxtMessage.getId(), ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP, 0);
csR.applyTo(clMessagesContainer);
}
});
}
但是,每次单击其中一个时,都会对已创建的所有 TextView 执行此操作,而不仅仅是在最近的 onClickListenerMethod 中创建的 TextView。我怎样才能解决这个问题?
解决方案
发生这种情况是因为每个新创建View
的都有一个默认值ID
,-1
因此应用于它们中的任何一个的约束都会影响所有Views
的ID
。
要解决此问题,您需要ID
为每个已创建的View
. 最简单的方法是使用类中的静态generateViewId()
方法View
。用法如下所示:
TextView lblNxtMessage = new TextView(MainActivity.this);
lblNxtMessage.setId(View.generateViewId());
推荐阅读
- vba - 如何从 VBA 代码启动 Access 加载项(不是 COM 加载项)?
- python - QComboBox 自动完成 (QCompleter?)
- python - 以分布式方式为 Python 模块指定命令行参数(就像 abseil 一样)
- java - 方法不会替换列表中的最后一个元素
- ruby-on-rails - 善用动作线
- hadoop - 使用 Hive Left Outer Join 的以下区别
- python - 根据 Python3 中的值传递可选参数
- php - 如何将字符串从 php 回显到 android studio
- oracle - oracle中CLOB的数据长度是多少?
- python - TensorFlow MovingAverageOptimizer 在 V1 和 V2 之间的兼容性