Fragmentのライフサイクルの中でコードをどこに書けばうまく動くか確認してみました。Fragmentのライフサイクルは下記のリンクを参照してください。
フラグメント | Android Developers
はじめは、レイアウトファイルに初めからFragmentを配置する方法です。
activity_main.xml
<?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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<fragment
android:id="@+id/fragment"
android:name="com.example.myfragmentposex.FragmentA"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@+id/fragment2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<fragment
android:id="@+id/fragment2"
android:name="com.example.myfragmentposex.FragmentB"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/fragment" />
</androidx.constraintlayout.widget.ConstraintLayout>
fragment_a.xml
<?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/frameLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".FragmentA">
<TextView
android:id="@+id/textViewA"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/fragmentA_Text"
android:textSize="30sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
fragment_b.xml
<?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/frameLayout2"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".FragmentB">
<!-- TODO: Update blank fragment layout -->
<TextView
android:id="@+id/textViewB"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="@string/fragmentB_Text"
android:textSize="30sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/buttonB"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button_B"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textViewB" />
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.kt は何もさわってません。
package com.example.myfragmentposex
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
FragmentA.kt もそのままです。
package com.example.myfragmentposex
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
class FragmentA : Fragment() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_a, container, false)
}
}
fragmentB.kt にはボタンをクリックしたらFragmetntAのtextviewに”クリックされました”を追記するコードを書きます。まずは、onCreateViewに書いてみます。
package com.example.myfragmentposex
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.TextView
class FragmentB : Fragment() {
// TODO: Rename and change types of parameters
private var textViewA: TextView? = null
private var textViewB: TextView? = null
private var button: Button? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
textViewA = getActivity()?.findViewById<View>(R.id.textViewA) as TextView?
//textViewB = view?.findViewById<View>(R.id.textViewB) as TextView?
button = view?.findViewById<View>(R.id.buttonB) as Button?
button?.setOnClickListener(){
textViewA?.append("ボタンクリックで追加。")
}
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_b, container, false)
}
}
ボタンをクリックしてみます。
次にコードをonActivityCreatedに移動させて試してみます。
package com.example.myfragmentposex
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Button
import android.widget.TextView
class FragmentB : Fragment() {
// TODO: Rename and change types of parameters
private var textViewA: TextView? = null
private var textViewB: TextView? = null
private var button: Button? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_b, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
textViewA = getActivity()?.findViewById<View>(R.id.textViewA) as TextView?
//textViewB = view?.findViewById<View>(R.id.textViewB) as TextView?
button = view?.findViewById<View>(R.id.buttonB) as Button?
button?.setOnClickListener(){
textViewA?.append("ボタンクリックで追加。")
}
}
}
今度はちゃんと表示されました。
後、”onStart”や”onResume”に移動させて試しましたが結果は”onActivityCreated”の時と同じです。
一度、”onActivityCreated”では動かなかった時があり、”onStart”に動かしたら動いたことがあったので”onActivityCreated”に”書くのを基本にして、適宜、”onStart”や”onResume”に移動させて試すのが現実的でしょうか。
コメント