Как использовать отдельные действия ConstraintSet для разных TextViews в одном ConstraintLayout? - PullRequest
0 голосов
/ 30 июня 2018

Мой вопрос вытекает из этого вопроса: Android: Как программно установить layout_constraintRight_toRightOf "parent" .

У меня написан следующий код, который должен ограничивать новый TextView либо слева (btnSendL), либо справа (btnSendR) ConstraintLayout.

@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, а не только для TextView, созданного внутри самого последнего onClickListenerMethod. Как я могу это исправить?

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Я рекомендую setId() к новому TextView

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);
            }
        });
    }
}
0 голосов
/ 30 июня 2018

Это происходит потому, что каждый вновь созданный View имеет значение по умолчанию ID, равное -1, поэтому ограничения, применяемые к любому из них, влияют на все Views с этим ID.

Чтобы это исправить, вам нужно сгенерировать уникальный ID для каждого созданного View. Самый простой способ - использовать статический метод generateViewId() из класса View. Использование будет выглядеть так:

TextView lblNxtMessage = new TextView(MainActivity.this);
lblNxtMessage.setId(View.generateViewId());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...