便利なConstraintLayoutだが、コードからマージンを変更するにはどうすればいいか。
簡単なサンプルを使って確認してみる。
簡単なサンプルを使って確認してみる。
このようなボタン配置があったとする。
ちなみにレイアウトファイルはこうだ。
onCreate()を以下のように記述する。
メソッド名からすると新しく追加するような連想をしてしまうが、恐らくこれで大丈夫だ。
実行結果はこうなる。
期待通りの結果を得る事が出来た!
ちなみにレイアウトファイルはこうだ。
<?xml version="1.0" encoding="utf-8"?>
<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/constraint_change_root_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ConstraintChangeActivity">
<Button
android:id="@+id/constraint_change_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:text="Button"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
このボタンの左側のマージンをコードから100に変更する。onCreate()を以下のように記述する。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_constraint_change)
// 新しい制約をコピーとして作成する
val constraintSet = ConstraintSet()
constraintSet.clone(constraint_change_root_layout)
// マージンのpxをdpに変換する
val metrics = resources.displayMetrics
val newMargin = (100 * metrics.density).toInt()
// 左側のマージンを設定する
constraintSet.connect(constraint_change_button.id, ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START, newMargin)
// 変更を適用する
constraintSet.applyTo(constraint_change_root_layout)
}
constraintSet.connect()が肝となる箇所だ。メソッド名からすると新しく追加するような連想をしてしまうが、恐らくこれで大丈夫だ。
実行結果はこうなる。
期待通りの結果を得る事が出来た!
コメント