【Android & Kotlin】View(ビュー)から他のView(ビュー)に直接アクセスする方法

Android & Kotlin

他の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のインスタンスそのものなのでキャスト可能ということです。

ソースコード

開発環境は次の通りです。

PCMacBook Pro(2016年モデル)
IDEAndroid Studio 4.0.1
Android SDKminSdkVersion 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.")
    }
}

コメント

タイトルとURLをコピーしました