Fragment を使ってみる(その3)

Android Studio

Fragmentのライフサイクルの中でコードをどこに書けばうまく動くか確認してみました。Fragmentのライフサイクルは下記のリンクを参照してください。

フラグメント  |  Android デベロッパー  |  Android Developers
A Fragment represents a behavior or a portion of user interface in an Activity. You can combine multiple fragments in a single activity to build a multi-pane UI...

はじめは、レイアウトファイルに初めから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”に移動させて試すのが現実的でしょうか。

コメント

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