0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

fragment更新

Last updated at Posted at 2024-08-04

ここでは、既存のFragmentにデータを渡して画面を更新する方法を記載します。これにより、Fragmentが再作成されずにデータを更新することができます。

1. MainActivity の実装

// MainActivity.kt
package com.example.myapplication

import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.commit

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Fragmentを追加
        if (savedInstanceState == null) {
            supportFragmentManager.commit {
                replace(R.id.fragment_container, MyFragment())
            }
        }

        // ボタンのクリックリスナー
        findViewById<Button>(R.id.button_next).setOnClickListener {
            val intent = Intent(this, NextActivity::class.java)
            startActivity(intent)
        }
    }
}

2. MyFragment の実装

// MyFragment.kt
package com.example.myapplication

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.fragment.app.Fragment

class MyFragment : Fragment() {

    private lateinit var textView: TextView

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = inflater.inflate(R.layout.fragment_my, container, false)
        textView = view.findViewById(R.id.text_view)
        return view
    }

    fun updateData(data: String) {
        textView.text = data
    }
}

3. NextActivity の実装

// NextActivity.kt
package com.example.myapplication

import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity

class NextActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_next)

        // ボタンのクリックリスナー
        findViewById<Button>(R.id.button_update_fragment).setOnClickListener {
            val fragment = supportFragmentManager.findFragmentById(R.id.fragment_container) as? MyFragment
            fragment?.updateData("新しいデータ")

            // 前の画面に戻る
            finish()
        }
    }
}

4. レイアウトファイル

activity_main.xml

<!-- res/layout/activity_main.xml -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <Button
        android:id="@+id/button_next"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="次の画面へ"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true" />
</RelativeLayout>

fragment_my.xml

<!-- res/layout/fragment_my.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center">

    <TextView
        android:id="@+id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="初期データ" />
</LinearLayout>

activity_next.xml

<!-- res/layout/activity_next.xml -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button_update_fragment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="データ更新"
        android:layout_centerInParent="true" />
</RelativeLayout>

説明

  1. MainActivityでは、最初にFragmentを追加し、ボタンをクリックするとNextActivityに遷移します。
  2. MyFragmentでは、TextViewを保持し、updateDataメソッドで表示データを更新します。
  3. NextActivityでは、ボタンをクリックするとMyFragmentupdateDataメソッドを呼び出し、新しいデータを渡します。その後、finishメソッドを呼んで前の画面に戻ります。

この実装により、前の画面に戻った際にFragmentの表示内容が更新されます。

updateData メソッドの中でActivityを取得してデータを渡すことはできます。ただし、Activityがそのデータを受け取るためのインターフェースやメソッドを持っている必要があります。

以下は、FragmentがActivityにデータを渡し、そのデータをActivityが処理する例です。

1. Activityにインターフェースを定義する

まず、ActivityにFragmentからデータを受け取るためのインターフェースを定義します。

// MainActivity.kt
package com.example.myapplication

import android.content.Intent
import android.os.Bundle
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.commit

class MainActivity : AppCompatActivity(), DataUpdateListener {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Fragmentを追加
        if (savedInstanceState == null) {
            supportFragmentManager.commit {
                replace(R.id.fragment_container, MyFragment())
            }
        }

        // ボタンのクリックリスナー
        findViewById<Button>(R.id.button_next).setOnClickListener {
            val intent = Intent(this, NextActivity::class.java)
            startActivity(intent)
        }
    }

    override fun onDataUpdate(data: String) {
        val fragment = supportFragmentManager.findFragmentById(R.id.fragment_container) as? MyFragment
        fragment?.updateData(data)
    }
}

// インターフェースの定義
interface DataUpdateListener {
    fun onDataUpdate(data: String)
}

2. FragmentでActivityを使ってデータを渡す

Fragmentの中でActivityにデータを渡すための処理を追加します。

// MyFragment.kt
package com.example.myapplication

import android.content.Context
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.fragment.app.Fragment

class MyFragment : Fragment() {

    private lateinit var textView: TextView
    private var dataUpdateListener: DataUpdateListener? = null

    override fun onAttach(context: Context) {
        super.onAttach(context)
        if (context is DataUpdateListener) {
            dataUpdateListener = context
        } else {
            throw RuntimeException("$context must implement DataUpdateListener")
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val view = inflater.inflate(R.layout.fragment_my, container, false)
        textView = view.findViewById(R.id.text_view)
        return view
    }

    fun updateData(data: String) {
        textView.text = data
    }

    // FragmentからActivityにデータを渡すメソッド
    fun sendDataToActivity(data: String) {
        dataUpdateListener?.onDataUpdate(data)
    }
}

3. 次の画面でデータを更新する

NextActivityでボタンをクリックしたときに、データをFragment経由でActivityに渡します。

// NextActivity.kt
package com.example.myapplication

import android.os.Bundle
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity

class NextActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_next)

        // ボタンのクリックリスナー
        findViewById<Button>(R.id.button_update_fragment).setOnClickListener {
            val mainActivity = applicationContext as? MainActivity
            mainActivity?.onDataUpdate("新しいデータ")

            // 前の画面に戻る
            finish()
        }
    }
}

レイアウトファイル

activity_main.xml

<!-- res/layout/activity_main.xml -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <Button
        android:id="@+id/button_next"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="次の画面へ"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true" />
</RelativeLayout>

fragment_my.xml

<!-- res/layout/fragment_my.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center">

    <TextView
        android:id="@+id/text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="初期データ" />
</LinearLayout>

activity_next.xml

<!-- res/layout/activity_next.xml -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button_update_fragment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="データ更新"
        android:layout_centerInParent="true" />
</RelativeLayout>

説明

  1. MainActivityDataUpdateListenerインターフェースを実装し、onDataUpdateメソッドでデータを受け取ってFragmentに渡します。
  2. MyFragmentonAttachメソッドをオーバーライドし、ActivityがDataUpdateListenerインターフェースを実装していることを確認します。sendDataToActivityメソッドを追加して、データをActivityに渡すことができます。
  3. NextActivityでボタンをクリックしたときに、MainActivityonDataUpdateメソッドを呼び出してデータを更新します。

これにより、次画面でボタンを押したときに前の画面のFragmentの表示内容が更新されるようになります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?