Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to programmatically access the current constraints of views in a ConstraintLayout?

I can programmatically modify constraints of a view in a ConstraintLayout using ConstraintSet but before applying modifications, I want to test that it hasn't been done already. To do this I need to programmatically access the current constraints of a view in a ConstraintLayout.

For example, here I want to remove the constraint between the top of the TextView 'title' and the bottom of TextView view 'subtitle'. Then Constrain the top of TextView 'title' to the bottom of 'videoView'. But first I need to check if TextView 'title' isn't already constrained to the bottom of 'videoView' (code modified from android's official website). Note, I can't insert the final line of HTML on this website, it's /android.support.constraint.ConstraintLayout in angle brackets.

public class MainActivity extends AppCompatActivity {
ConstraintSet mConstraintSet = new ConstraintSet(); // create a Constraint Set
ConstraintLayout mConstraintLayout; // cache the ConstraintLayout

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mConstraintLayout = (ConstraintLayout) findViewById(R.id.root);
    mConstraintSet.clone(mConstraintLayout); // get constraints from ConstraintSet
}

public void userDoesSomething(View v) {
    //test if title has already been constrained to bottom of videoView
    if (mConstraintLayout 'TITLE' IS NOT CONSTRAINED TO THE BOTTOM OF 'VIDEOVIEW'){
        mConstraintSet.connect(R.id.Title, ConstraintSet.TOP, R.id.videoView, ConstraintSet.BOTTOM); // set new constraints to ConstraintSet
        mConstraintSet.applyTo(mConstraintLayout); // set new constraints to ConstraintLayout
    }
}

}

<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.test.MainActivity"
android:orientation="vertical">

<VideoView
    android:id="@+id/videoView"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"

    />

<TextView
    android:id="@+id/subtitiles"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_constraintTop_toBottomOf="@+id/videoView"
    app:layout_constraintLeft_toLeftOf="parent"
    android:gravity="center"
    android:text="The problem with this pond is that there are too many toads"
    android:textSize="25sp"
    android:background="@android:color/white"

    />

<TextView
    android:id="@+id/title"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:layout_constraintTop_toBottomOf="@+id/subtitiles"
    app:layout_constraintLeft_toLeftOf="parent"
    android:gravity="center"
    android:text="Toad"
    android:textSize="25sp"
    android:background="@android:color/white"
    />

like image 615
clueless Avatar asked Aug 18 '17 14:08

clueless


1 Answers

To my acknowledge, there isn't method for that, hovewer you can try to comparate two ConstraintLayout.LayoutParams, for exemple :

public class MainActivity extends AppCompatActivity {
ConstraintSet mConstraintSet = new ConstraintSet(); // create a Constraint Set
ConstraintLayout mConstraintLayout; // cache the ConstraintLayout

int mConstraintValue;
TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mConstraintLayout = (ConstraintLayout) findViewById(R.id.root);
        mTextView = (TextView) findViewById(R.id.title);
        mConstraintSet.clone(mConstraintLayout); // get constraints from ConstraintSet
        ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) mTextView.getLayoutParams();
        mConstraintValue = params.topToBottom;
    }

    public void userDoesSomething(View v) {
        //test if title has already been constrained to bottom of videoView
         ConstraintLayout.LayoutParams params = (ConstraintLayout.LayoutParams) mTextView.getLayoutParams();
        if (mConstraintValue.equals(params.topToBottom)){
            mConstraintSet.connect(R.id.Title, ConstraintSet.TOP, R.id.videoView, ConstraintSet.BOTTOM); // set new constraints to ConstraintSet
            mConstraintSet.applyTo(mConstraintLayout); // set new constraints to ConstraintLayout
        }
    }
}

Hope this helps.

like image 183
Cochi Avatar answered Sep 23 '22 06:09

Cochi