2020年11月10日火曜日

ConstraintSet を使って Activity を再生成せずにレイアウトを切り替える

自分で縦横レイアウトを切り替えるので Manifest に設定を追加
  1. <activity  
  2.     android:name=".MainActivity"  
  3.     android:configChanges="orientation|screenSize|screenLayout|keyboardHidden">  
  4.   
  5.     ...  
  6.   
  7. </activity>  
縦画面用のレイアウトと、横画面用のレイアウトを用意する。
例としてここでは縦画面では上部に 16:9 で配置し、横画面では全画面に配置している。

縦画面用
res/layout/activity_main_port.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <androidx.constraintlayout.widget.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/constraintLayout"  
  6.     android:layout_width="match_parent"  
  7.     android:layout_height="match_parent"  
  8.     tools:context=".MainActivity">  
  9.   
  10.     <include  
  11.         android:id="@+id/container"  
  12.         layout="@layout/activity_main"  
  13.         android:layout_width="0dp"  
  14.         android:layout_height="0dp"  
  15.         app:layout_constraintDimensionRatio="16:9"  
  16.         app:layout_constraintEnd_toEndOf="parent"  
  17.         app:layout_constraintStart_toStartOf="parent"  
  18.         app:layout_constraintTop_toTopOf="parent" />  
  19.   
  20. </androidx.constraintlayout.widget.ConstraintLayout>  
横画面用
res/layout/activity_main_land.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <androidx.constraintlayout.widget.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/constraintLayout"  
  6.     android:layout_width="match_parent"  
  7.     android:layout_height="match_parent"  
  8.     tools:context=".MainActivity">  
  9.   
  10.     <include  
  11.         android:id="@+id/container"  
  12.         layout="@layout/activity_main"  
  13.         android:layout_width="0dp"  
  14.         android:layout_height="0dp"  
  15.         app:layout_constraintBottom_toBottomOf="parent"  
  16.         app:layout_constraintEnd_toEndOf="parent"  
  17.         app:layout_constraintStart_toStartOf="parent"  
  18.         app:layout_constraintTop_toTopOf="parent" />  
  19.   
  20. </androidx.constraintlayout.widget.ConstraintLayout>  
activity_main_port.xml と activity_main_land.xml からそれぞれ ConstraintSet を構成する。
onConfigurationChanged() で画面の向きに応じて対応する ConstraintSet を ConstraintLayout に applyTo() する。
  1. class MainActivity : AppCompatActivity() {  
  2.   
  3.     private val constraintSetPort = ConstraintSet()  
  4.     private val constraintSetLand = ConstraintSet()  
  5.   
  6.     private lateinit var constraintLayout: ConstraintLayout  
  7.   
  8.     override fun onCreate(savedInstanceState: Bundle?) {  
  9.         super.onCreate(savedInstanceState)  
  10.         val layoutId = when (resources.configuration.orientation) {  
  11.             Configuration.ORIENTATION_LANDSCAPE -> R.layout.activity_main_land  
  12.             else -> R.layout.activity_main_port  
  13.         }  
  14.         setContentView(layoutId)  
  15.         constraintLayout = findViewById(R.id.constraintLayout)  
  16.   
  17.         constraintSetPort.clone(this, R.layout.activity_main_port)  
  18.         constraintSetLand.clone(this, R.layout.activity_main_land)  
  19.     }  
  20.   
  21.     override fun onConfigurationChanged(newConfig: Configuration) {  
  22.         super.onConfigurationChanged(newConfig)  
  23.   
  24.         val constraintSet = when (newConfig.orientation) {  
  25.             Configuration.ORIENTATION_LANDSCAPE -> constraintSetLand  
  26.             else -> constraintSetPort  
  27.         }  
  28.         constraintSet.applyTo(constraintLayout)  
  29.     }  
  30. }  






0 件のコメント:

コメントを投稿