Android開発でFragmentからActivityのUIを操作したい場面があります。その方法をいくつかメモします。
①findViewByIdで直接UIを操作する
val textView = requireActivity().findViewById<TextView>(R.id.header_text)
textView.text = "テキストを変更しました。"
シンプルで分かりやすく、小規模なアプリで手っ取り早く使えます。しかしActivityに依存するのと、複雑になると保守が難しくなります。
②Activityの関数をFragmentから呼び出す
🔸Activityに関数を定義
class MainActivity : AppCompatActivity() {
fun setHeaderVisible(visible: Boolean) {
headerLayout.visibility = if (visible) {
View.VISIBLE
} else {
View.GONE
}
}
}
🔸Fragmentから呼び出す
(requireActivity() as? MainActivity)?.setHeaderVisible(true)
✅ メリット
Activity内でUI操作以外の処理にも応用できます。ただし特定のActivityに依存するため、再利用性、保守性は下がります。
③インターフェースで連携
インターフェースを定義する
interface HeaderController {
fun setHeaderVisible(visible: Boolean)
}
Activityにてインターフェースを実装する
class MainActivity : AppCompatActivity(), HeaderController {
override fun setHeaderVisible(visible: Boolean) {
headerLayout.visibility = if (visible) {
View.VISIBLE
} else {
View.GONE
}
}
}
Fragmentから呼び出す
(requireActivity() as? HeaderController)?.setHeaderVisible(true)
ActivityとFragmentで別々の役割を持つことができ、複数のActivityに再利用できます。テスト・保守性に優れています。
特定のActivity前提で関数を呼ぶ場合は②を使用し、再利用性や保守性を高めたい場合は③を使用します。