26

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

しかし、問題は、私が C から B または B から A に移動するときonResume()Fragment.

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

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

4

8 に答える 8

23

onResume()の は、が再開されFragmentたときにのみ呼び出されます。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;
}
于 2013-11-27T16:58:36.137 に答える
15

replaceで代わりaddにメソッドを使用してみてくださいFragmentTransaction。これは私にとってはうまくいきます:

FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragment_container, fragment);
ft.addToBackStack(null);
ft.commit();
于 2013-11-27T15:34:27.020 に答える
8

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

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

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

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

于 2018-01-10T18:04:06.920 に答える
3

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

@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
}
于 2018-07-18T20:30:50.480 に答える