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"
/>
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With