【问题标题】:How to utilise seperate ConstraintSet actions for different TextViews in the same ConstraintLayout?如何为同一 ConstraintLayout 中的不同 TextView 使用单独的 ConstraintSet 操作?
【发布时间】:2018-06-30 01:50:43
【问题描述】:

我的问题来自这个问题:Android : How to programatically set 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。我该如何解决这个问题?

【问题讨论】:

    标签: android android-layout android-studio


    【解决方案1】:

    发生这种情况是因为每个新创建的 View 都有一个默认的 ID -1,因此应用于其中任何一个的约束都会影响带有 ID 的所有 Views

    要解决此问题,您需要为每个创建的View 生成一个唯一的ID。最简单的方法是使用View 类中的静态方法generateViewId()。用法如下所示:

    TextView lblNxtMessage = new TextView(MainActivity.this);
    lblNxtMessage.setId(View.generateViewId());
    

    【讨论】:

      【解决方案2】:

      我向新的TextView推荐setId()

      lblNxtMessage.setId(View.generateViewId());
      

      示例

       public class MainActivity extends AppCompatActivity {
      
          @Override
          protected void onCreate(final 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.setId(View.generateViewId());
                      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.setId(View.generateViewId());
                      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);
                  }
              });
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-22
        • 2018-02-26
        • 2018-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多