他のView(ビュー)の状態をちょっと知りたいなどのケースで他のビューに直接アクセスしたいことがあります。
そんなときの方法を説明します。
そそたた
本来、そもそもそのようなケースが無いように設計したり、データバイディングなどで間接的にアクセスすべきですが、ちょっと内緒でアクセスしたいときに使います。
キョロ^(・д・。)(。・д・)^キョロ
やり方
レイアウトにHogeHogeViewとFugaFugaViewを配置して、HogeHogeViewのhogeメソッドからFugaFugaViewのfugaメソッドを呼び出してみます。
fun hoge() {
val activity: Activity? = context as? Activity
activity?.fugafugaView?.fuga()
}
説明不要な気がしますが、contextをActivityにキャストしてアクセスするだけです。
そそたた
Activityクラスの基底クラスがContextであり、Viewから参照できるContextはActivityのインスタンスそのものなのでキャスト可能ということです。
ソースコード
開発環境は次の通りです。
PC | MacBook Pro(2016年モデル) |
IDE | Android Studio 4.0.1 |
Android SDK | minSdkVersion 21 targetSdkVersion 30 |
言語 | Kotlin 1.3.72 |
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".ui.main.TopFragment">
<com.sosotata.minesweeper.ui.widgets.HogeHogeView
android:id="@+id/hogehogeView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<com.sosotata.minesweeper.ui.widgets.FugaFugaView
android:id="@+id/fugafugaView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
package com.sosotata.minesweeper.ui.widgets
import android.app.Activity
import android.content.Context
import android.util.AttributeSet
import android.view.View
import kotlinx.android.synthetic.main.test_fragment.*
class HogeHogeView: View {
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
}
fun hoge() {
val activity: Activity? = context as? Activity
activity?.fugafugaView?.fuga()
}
}
package com.sosotata.minesweeper.ui.widgets
import android.content.Context
import android.util.AttributeSet
import android.view.View
class FugaFugaView: View {
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
}
fun fuga() {
println("Fuga Fuga.")
}
}
コメント