Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

More than 1 year has passed since last update.

【Andoroid】フラグメントマネージャーのすゝめ②【backStackEntry】

Posted at

FragmentManager①の続きです。
今回は、バックスタックに関するまとめになります。

バックスタック

バックスタックとは、Androidアプリケーションで画面遷移やフラグメントの
トランザクションなどの変更を履歴として管理する仕組みです。

戻るボタンを押すと前の画面さらに押すともう一個前の画面に戻りますよね。
このような画面遷移ができるのはバックスタックのおかげなのです。

バックスタック管理

addToBackStackメソッドを使用しすることでトランザクションをバックスタックに保存できます。
トランザクションに関連する名前を指定しない場合は、引数にnullを入れます。
指定する場合は、名前を指定します。(例:)
名前を指定することでバックスタック内で特定のトランザクションを識別するのに役立ちます。

val fragmentManager = supportFragmentManager
val fragmentTransaction = fragmentManager.beginTransaction()
fragmentTransaction.add(R.id.container, newFragment)
//トランザクションをバックスタックに保存
fragmentTransaction.addToBackStack("transactionName")//nullでも可
//トランザクションをコミットする
fragmentTransaction.commit()

トランザクションをバックスタックに保存を保存することを
バックスタックをエントリーすると言います。

バックスタックエントリーの取得

バックスタックエントリーを取得するには、getBackStackEntryAtメソッドを使用します。
エントリーは、リストのようにインデックス[0]から追加されていきます。
backStackEntryCountから-1することで最後のエントリーを指定できます。

//supportFragmentManagerからバックスタックの数を取得
val backStackEntryCount = supportFragmentManager.backStackEntryCount

if (backStackEntryCount > 0) {
    //バックスタックエントリーを取得する
    //引数:バックスタックエントリーのインデックスを指定する
    val lastBackStackEntry = 
        supportFragmentManager.getBackStackEntryAt(backStackEntryCount -1)

    // エントリーから情報を取得できます
    val entryName = lastBackStackEntry.name
    val entryId = lastBackStackEntry.id
    // 取得した情報を使って何かしらの処理を行うことができます
    // 例: Log.d("BackStackInfo", "Name: $entryName, ID: $entryId")
}

TIPS:エントリーとは?
バックスタックエントリーは、フラグメントマネージャーのトランザクションがバックスタックに追加されたときに作成されるオブジェクトです。

前の状態に戻る

バックスタックを利用して前の画面に戻るには、エントリーをポップします。
バックスタック上のエントリーをポップして前の状態に戻る場合は、
popBackStack()メソッドを使用します。
これで、最後に追加されたエントリーがポップされ、前のフラグメントに戻ります。

//何も指定しない場合は、最後のエントリーを参照
supportFragmentManager.popBackStack()
//トランザクションに保存されているエントリー名を使用してポップ
supportFragmentManager.popBackStack("transactionName", FragmentManager.POP_BACK_STACK_INCLUSIVE)
//トランザクションに保存されているエントリーIDを使用してポップ
supportFragmentManager.popBackStack(123, FragmentManager.POP_BACK_STACK_INCLUSIVE)

TIPS:ポップとは?
ポップするとバックスタックから追加されたエントリーを削除する操作を行います。
また、それに関連するトランザクションやフラグメントの状態が元に戻ります。
これにより、前の画面や状態に戻る効果が得られます。

最後に

簡単なようで難しい

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?