ConstraintLayoutの制約をJavaで設定する

ConstraintLayout#LayoutParamsを使う. まず、ConstraintLayout上のViewを取得する.
  1. Button button = findViewById(R.id.button);

もしくは、追加したい適当なオブジェクトを作成し、ConstraintLayoutにViewを追加する.
  1. Button button = new Button(this);
  2. constrintLayout.addView(button)

※先にaddViewしないと、次のlayoutParamsにnullが入る(エラーが発生する)ので注意.

次に、上のViewのLayoutParamsを取得し、適当に設定する. 親View(?)と連結したいときは、PARENT_IDを代入する. ほかのViewと連結したいときは、View#getIdメソッドを使う. LayoutParamsのフィールドについては、xmlのものとほとんど同じなので、そちら(例えば、Android Studioのデザインビューとか)を見るとわかりやすいと思う.
  1. ConstraintLayout.LayoutParams layoutParams = (ConstraintLayout.LayoutParams)button.getLayoutParams();
  2. layoutParams.startToEnd = anotherView.getId();
  3. layoutParams.endToEnd = ConstraintLayout.LayoutParams.PARENT_ID;
  4. layoutParams.topToTop = ConstraintLayout.LayoutParams.PARENT_ID;
  5. layoutParams.bottomToBottom = ConstraintLayout.LayoutParams.PARENT_ID;
  6. layoutParams.verticalBias = (float) 0.1;
  7. layoutParams.horizontalBias = (float) 0.1;
  8. button1.setLayoutParams(layoutParams);

最後に、上の変更を適用する.
  1. button.setLayoutParams(layoutParams);

他にもこちらと同様に、ViewのWidthやHeight、Marginを変更できたりする(MarginLinearLayoutにキャストしなくてもよい、次の適用例を参照).

適用例


ConstraintLayout上に2つのボタンを表示させる.

activity_main.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:id="@+id/constraintLayoutParamsLayout"
  6. android:layout_width="match_parent"
  7. android:layout_height="match_parent"
  8. tools:context="com.blogspot.ko-ika.constraintlayoutparams.MainActivity">
  9.  
  10. <Button
  11. android:id="@+id/button1"
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. android:text="Button1" />
  15.  
  16. <Button
  17. android:id="@+id/button2"
  18. android:layout_width="wrap_content"
  19. android:layout_height="wrap_content"
  20. android:text="Button2" />
  21. </android.support.constraint.ConstraintLayout>

activity_main.xml
  1. package jp.blogspot.ko-ika.constraintlayoutparams;
  2.  
  3. import android.support.constraint.ConstraintLayout;
  4. import android.support.v7.app.AppCompatActivity;
  5. import android.os.Bundle;
  6. import android.widget.Button;
  7.  
  8. public class MainActivity extends AppCompatActivity {
  9.  
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.activity_main);
  14.  
  15. Button button1 = findViewById(R.id.button1);
  16. Button button2 = findViewById(R.id.button2);
  17.  
  18. ConstraintLayout constraintLayout = findViewById(R.id.constraintLayoutParamsLayout);
  19.  
  20. // Button1の設定
  21. ConstraintLayout.LayoutParams layoutParams = (ConstraintLayout.LayoutParams)button1.getLayoutParams();
  22. layoutParams.topMargin = 8;
  23. layoutParams.rightMargin = 16;
  24. layoutParams.startToStart = ConstraintLayout.LayoutParams.PARENT_ID;
  25. layoutParams.endToEnd = ConstraintLayout.LayoutParams.PARENT_ID;
  26. layoutParams.topToTop = ConstraintLayout.LayoutParams.PARENT_ID;
  27. layoutParams.bottomToBottom = ConstraintLayout.LayoutParams.PARENT_ID;
  28. layoutParams.verticalBias = (float) 0.1;
  29. layoutParams.horizontalBias = (float) 0.1;
  30. button1.setLayoutParams(layoutParams);
  31.  
  32. // Button2の設定
  33. layoutParams = (ConstraintLayout.LayoutParams)button2.getLayoutParams();
  34. layoutParams.leftMargin = 16;
  35. layoutParams.startToEnd = button1.getId();
  36. layoutParams.endToEnd = ConstraintLayout.LayoutParams.PARENT_ID;
  37. layoutParams.topToTop = ConstraintLayout.LayoutParams.PARENT_ID;
  38. layoutParams.bottomToBottom = ConstraintLayout.LayoutParams.PARENT_ID;
  39. layoutParams.verticalBias = (float)0.1;
  40. layoutParams.horizontalBias = 0;
  41. button2.setLayoutParams(layoutParams);
  42. }
  43. }

実行例


さらに


ConstraintSetを使うと同じ様に設定できるらしい.


が、この方法だと、Biasが設定できない?

また、Viewが実際に配置される(?)まで、そのIDが取得できないみたいなので、注意が必要.
実際に、上の適用例を次のようにしてみる.

activity_main.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:app="http://schemas.android.com/apk/res-auto"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:id="@+id/constraintLayoutParamsLayout"
  6. android:layout_width="match_parent"
  7. android:layout_height="match_parent"
  8. tools:context="com.blogspot.ko-ika.constraintlayoutparams.MainActivity">
  9.  
  10. </android.support.constraint.ConstraintLayout>

activity_main.xml
  1.  
  2. Button button1 = new Button(this);
  3. Button button2 = new Button(this);
  4. ConstraintLayout constraintLayout = findViewById(R.id.constraintLayoutParamsLayout);
  5.  
  6. // Button1の設定
  7. constraintLayout.addView(button1);
  8. button1.setText("Button1");
  9. ConstraintLayout.LayoutParams layoutParams = (ConstraintLayout.LayoutParams)button1.getLayoutParams();
  10. layoutParams.topMargin = 8;
  11. layoutParams.rightMargin = 16;
  12. layoutParams.startToStart = ConstraintLayout.LayoutParams.PARENT_ID;
  13. layoutParams.endToEnd = ConstraintLayout.LayoutParams.PARENT_ID;
  14. layoutParams.topToTop = ConstraintLayout.LayoutParams.PARENT_ID;
  15. layoutParams.bottomToBottom = ConstraintLayout.LayoutParams.PARENT_ID;
  16. layoutParams.verticalBias = (float) 0.1;
  17. layoutParams.horizontalBias = (float) 0.1;
  18. button1.setLayoutParams(layoutParams);
  19.  
  20. // Button2の設定
  21. constraintLayout.addView(button2);
  22. button2.setText("Button2");
  23. layoutParams = (ConstraintLayout.LayoutParams)button2.getLayoutParams();
  24. layoutParams.leftMargin = 16;
  25. layoutParams.startToEnd = button1.getId();
  26. layoutParams.endToEnd = ConstraintLayout.LayoutParams.PARENT_ID;
  27. layoutParams.topToTop = ConstraintLayout.LayoutParams.PARENT_ID;
  28. layoutParams.bottomToBottom = ConstraintLayout.LayoutParams.PARENT_ID;
  29. layoutParams.verticalBias = (float)0.1;
  30. layoutParams.horizontalBias = 0;
  31. button2.setLayoutParams(layoutParams);

変更箇所をマークアップした. すると、次のようになってしまう.

参考にしたサイト



0 件のコメント:

コメントを投稿

FloatingActionButtonをスクロール中に消す

NestedScrollView を下にスクロールしている間は, FloatingActionButton を表示させないようにする. 少し変えれば, RecyclerView 等の他のScrollViewにも使えそう(未確認). 下に実際の挙動を示した. 目次 ...