web-dev-qa-db-ja.com

バックスタックからポップされたときにフラグメントonResume()が呼び出されない

こんにちは私はAndroidを使用しているアプリケーションを開発しています。単一のActivityと3つのフラグメントを使用しています。したがって、3つのフラグメントAB Cがあると考えてください。AからBに切り替えるとき、私はFragmentをBからCのバックスタックおよび類似の値に追加しています。Cから戻るをクリックすると、Bと同様にBからAも表示されます。

しかし、私がCからBまたはBからAに来たとき、それはonResume()またはFragmentの他のライフサイクルメソッドを呼び出していないということです。

Fragmentごとに実際にやりたいことActionBarではタイトルが異なります。したがって、私のコードでは、AからBまたはBからcに移動すると、フラグメント内のアクティビティのタイトルが変更されます。しかし、私が戻るをクリックすると、それに応じて変化しません。

実際の問題は何ですか?バックスタックからポップした後、Fragmentに対してonResume()を呼び出さないのはなぜですか?この問題を解決するにはどうすればよいですか?助けが必要。ありがとうございました。

18
nilkash

FragmentonResume()は、Activityが再開されたときにのみ呼び出されます。だからこれはあなたを助けません。私も今、同じような問題に直面しています。 OnBackStackChangedListenerを実装してスタックの最上部にあるフラグメント名を取得し、それに基づいてActionBarタイトルを設定できます。

private FragmentManager.OnBackStackChangedListener getListener()
{
    FragmentManager.OnBackStackChangedListener result = new FragmentManager.OnBackStackChangedListener()
    {
        public void onBackStackChanged()
        {
            FragmentManager manager = getFragmentManager();

            if (manager != null)
            {
                if(manager.getBackStackEntryCount() >= 1){
                    String topOnStack = manager.getBackStackEntryAt(manager.getBackStackEntryCount()-1).getName();
                    Log.i("TOP ON BACK STACK",topOnStack);
                }
                }
            }
    };

    return result;
}
20
Uma

replaceaddの代わりにFragmentTransactionメソッドを使用してみてください。私にとってこの作品:

FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragment_container, fragment);
ft.addToBackStack(null);
ft.commit();
14
PedroDuran

他の人がすでに言ったように、onResume()は、アクティビティ自体が再開されたときにのみ呼び出されるため、まったく役に立ちません。

新しいフラグメントを追加するのか、フラグメントトランザクションで既存のフラグメントを置き換えるのかを確認する必要があります。

  • 以前のフラグメントをreplace()した場合、前のフラグメントに戻ったときに、そのフラグメントが最初から再作成されるため、onCreateView()が再び呼び出され、ツールバーのタイトルを更新できます。あなたはおそらくすでにしています。

  • 新しいフラグメントをadd()した場合、前のフラグメントはまだそこにあり、表示されません。戻ったとき、バックスタックから最後のエントリを取得し(フラグメントマネージャーでgetBackStackEntryCount()およびgetBackStackEntryAt()を使用)、対応するFragmentオブジェクトを取得します(使用findFragmentByTag() in the fragment manager)、そのFragmentをすべてのフラグメントが継承するいくつかの基本クラスにキャストし、カスタムメソッドを呼び出します。 onVisible()、そのフラグメントについて。基本クラスのonVisible()のデフォルト実装は何もしません。各フラグメントをオーバーライドして、ツールバーのタイトル、FAB、および必要に応じてその他のものを更新します。また、コードの重複を避けるために、onVisible()からonResume()を呼び出しています。

6
Eric Sellin

このフラグメントのメソッドを使用できます:

@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
}
2
Mohammad Hadi

このコードをフラグメントに挿入します。

@Override
public void setUserVisibleHint(boolean visible) {
        super.setUserVisibleHint(visible);
        if (visible && isResumed()) {
            onResume();
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        if (!getUserVisibleHint()) {
            return;
        }
        setData();
    }
1

私はこの方法を使用して、このブロックコードをフラグメントに追加します

requireActivity().supportFragmentManager.addOnBackStackChangedListener {
            val fm = requireActivity().supportFragmentManager
            fm?.let {
                if (it.backStackEntryCount == YOUR_FRAGMENT_BACK_STACK_INDEX) {
                    // your fragment visible
                }
            }
        }
0
GianhTran