Android: как программно установить layout_constraintRight_toRightOf parent

У меня есть представление в ConstrainLayout следующим образом.

<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:maxWidth="260dp"
        android:textColor="#FFF"
        android:textSize="16sp"
        app:layout_constraintLeft_toLeftOf="@+id/parent"
        app:layout_constraintTop_toBottomOf="@id/message_date"
        android:id="@+id/text_main"
        />

Я хотел бы программно изменить представление на app:layout_constraintLeft_toLeftOf="@+id/parent" или layout_constraintLeft_toRightOf="@+id/parent" в recycleViewHolder на основе некоторых условий.


person Relm    schedule 16.01.2017    source источник
comment
@ W4R10CK Я не хочу добавлять представление, я просто хочу изменить выравнивание. Можете ли вы опубликовать соответствующую часть этого ответа?   -  person Relm    schedule 16.01.2017


Ответы (4)


Вот пример установки кнопки в нижней части родительского представления с использованием кода Java:

ConstraintLayout constraintLayout;
ConstraintSet constraintSet;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    constraintLayout = (ConstraintLayout) findViewById(R.id.activity_main_constraint_layout);

    Button button = new Button(this);
    button.setText("Hello");
    constraintLayout.addView(button);

    constraintSet = new ConstraintSet();
    constraintSet.clone(constraintLayout);

    constraintSet.connect(button.getId(), ConstraintSet.LEFT, constraintLayout.getId(), ConstraintSet.RIGHT, 0);
    constraintSet.constrainDefaultHeight(button.getId(), 200);
    constraintSet.applyTo(constraintLayout);

}

чтобы добиться чего-то подобного,

app:layout_constraintLeft_toLeftOf="@+id/parent" 

ваш java-код должен выглядеть так

set.connect(YOURVIEW.getId(),ConstraintSet.LEFT,ConstraintSet.PARENT_ID,ConstraintSet.LEFT,0);

и добиться чего-то подобного,

layout_constraintLeft_toRightOf="@+id/parent"

ваш java-код должен выглядеть так,

set.connect(YOURVIEW.getId(),ConstraintSet.LEFT,ConstraintSet.PARENT_ID,ConstraintSet.RIGHT,0);

Здесь я предполагаю, что android:id="@+id/parent" — это идентификатор вашего родительского ConstraintLayout .

person Darshan Soni    schedule 16.01.2017
comment
set.applyTo(layout); разве это не применяет эти ограничения к родителю вместо TextView? Должно быть? set.applyTo(button); или что-то подобное? - person Relm; 16.01.2017
comment
Нет, набор знает, к кому вы хотите применить изменения, теперь пришло время сообщить родительскому макету, эй, пожалуйста, примените эти изменения. так что это должно быть похоже на set.applyTo(parent). - person Darshan Soni; 17.01.2017
comment
Ваш код неверен, сначала вам нужно добавить кнопку в макет ограничения, а затем limitedSet.clone(constraintLayout); будет сделано. В противном случае ничего не делается для кнопки - person Khyati Fatania; 05.06.2017

набор ограничений = новый набор ограничений(); и так далее

Во всяком случае, у меня не сработало.

Решено

  LayoutParams layoutParams = (LayoutParams) viewToChange.getLayoutParams();
    layoutParams.leftToLeft = anotherViewId;
    layoutParams.rightToRight =anotherViewId;
    layoutParams.topToTop = anotherViewId;
    layoutParams.bottomToBottom = anotherViewId;
    layoutParams.startToStart =anotherViewId;
    layoutParams.endToEnd = anotherViewId;
    viewToChange.setLayoutParams(layoutParams);
person Holiday Fun    schedule 25.04.2020
comment
Кто-нибудь знает, почему в некоторых случаях набор ограничений просто не работает? У меня отлично работает при использовании LayoutParams - person tamj0rd2; 13.12.2020
comment
Этот метод работает для меня - я хочу изменить параметры LinearLayout, а его родителем является constrainLayout. Спасибо - person Adarsh Vijayan P; 27.07.2021

Используйте 1_

class MyLayout(context: Context) : ConstraintLayout(context) {

    fun show() {
        val view = ImageView(context)
        addView(view)
        val params = view.layoutParams as ConstraintLayout.LayoutParams
        params.height = 100 
        params.width = 50
        params.rightToRight = id
        view.requestLayout()
    }
}
person onmyway133    schedule 27.11.2018
comment
он возвращает ноль из view.layoutParams - person gmartinsnull; 22.02.2019

У меня была такая же ситуация, когда мне нужно было переместить buttons вниз после появления нового EditText. В файле XML у них были такие ограничения:

app:layout_constraintTop_toBottomOf="@+id/first_layout"

и то, что мне нужно было сделать, это программно изменить на что-то вроде:

app:layout_constraintTop_toBottomOf="@+id/second_layout"

Используя ConstraintLayout.LayoutParams, задача довольно проста, например.

Котлин:

val currentLayout = btn.layoutParams as ConstraintLayout.LayoutParams // btn is a View here
currentLayout.topToBottom = R.id.second_layout // resource ID of new parent field
btn.layoutParams = currentLayout

вот и все!

person dsounded    schedule 08.12.2020