Добавить ограничение для просмотра программно - PullRequest
0 голосов
/ 14 января 2019

Я накачал следующий вид внутри схемы ограничений. Вид:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="@color/colorPrimary"
    android:orientation="horizontal">
    <Button
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight=".25"
        android:text="menu"/>
<android.support.v7.widget.SearchView
    android:layout_width="0dp"
    android:layout_weight="1"
    android:layoutDirection="rtl"
    android:layout_height="match_parent">
</android.support.v7.widget.SearchView>
</LinearLayout>

Вид добавлен в макет контраста с использованием следующего кода:

ConstraintLayout constraintLayout  =  findViewById(R.id.root);
                View inflatedLayout= inflater.inflate(R.layout.menu, constraintLayout, false);                   constraintLayout.addView(inflatedLayout);

Вид перемещается в верхнюю часть экрана, потому что нет никаких ограничений. Он перекрывает панель инструментов, которая находится в верхней части макета. Панель инструментов просто находится в верхней части родительского элемента с идентификатором android:id="@+id/toolbar"

Как программно добавить ограничения, чтобы раздутый вид был ограничен под панелью инструментов. Я использовал набор ограничений, чтобы добавить ограничение в раздутое представление следующим образом:

 LayoutInflater inflater = LayoutInflater.from(PaymentStatus2.this);

                ConstraintLayout constraintLayout  =  findViewById(R.id.nested);

                View inflatedLayout= inflater.inflate(R.layout.menu, constraintLayout, false);
                constraintLayout.addView(inflatedLayout);
                ConstraintSet set = new ConstraintSet();
                 set.connect(constraintLayout.getId(),ConstraintSet.TOP,inflatedLayout.getId(),ConstraintSet.TOP,50);
            set.connect(constraintLayout.getId(),ConstraintSet.START,inflatedLayout.getId(),ConstraintSet.START,0);

                set.applyTo(constraintLayout);

В первой соединительной линии я соединяю родительскую вершину с верхней частью завышенного вида и устанавливаю поле в 50 dp, что должно служить моей цели - держать его ниже панели инструментов, высота которой составляет 50 dps, но это не отражается в макете. Думая, что представлению нужно хотя бы два контакта, я устанавливаю второе соединение, но оно не работает. Вот как это выглядит:

https://ibb.co/r2wK83V

раздутый макет все еще движется к вершине, как будто на нем нет ограничений.

1 Ответ

0 голосов
/ 14 января 2019

Для всех, кто застрял с этим, я узнал, как это делается. Раздуйте макет, добавьте его, затем клонируйте макет, затем вам нужно соединить все четыре конца ограничения, только тогда он будет работать.

Функция подключения принимает пять параметров (i) идентификатор представления представления, (ii) направление ограничения, (iii) другой идентификатор представления, (iv) направление ограничения, (v) поле

 ConstraintLayout constraintLayout  =  findViewById(R.id.nested);
                View inflatedLayout= inflater.inflate(R.layout.menu, constraintLayout , false);
                inflatedLayout.setLayoutParams(new ConstraintLayout.LayoutParams(0,0));
                constraintLayout.addView(inflatedLayout,0);
                ConstraintSet set = new ConstraintSet();
                set.clone(constraintLayout);
                set.connect(inflatedLayout.getId(),ConstraintSet.TOP,toolbar.getId(),ConstraintSet.BOTTOM,8);
                set.connect(inflatedLayout.getId(),ConstraintSet.START,constraintLayout.getId(),ConstraintSet.START,8);
                set.connect(inflatedLayout.getId(),ConstraintSet.END,constraintLayout.getId(),ConstraintSet.END,8);
                set.connect(inflatedLayout.getId(),ConstraintSet.BOTTOM,swipeRefreshLayout.getId(),ConstraintSet.TOP,8);
                set.applyTo(constraintLayout);
...