こんにちは私は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()
を呼び出さないのはなぜですか?この問題を解決するにはどうすればよいですか?助けが必要。ありがとうございました。
Fragment
のonResume()
は、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;
}
replace
でadd
の代わりにFragmentTransaction
メソッドを使用してみてください。私にとってこの作品:
FragmentTransaction ft = activity.getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragment_container, fragment);
ft.addToBackStack(null);
ft.commit();
他の人がすでに言ったように、onResume()
は、アクティビティ自体が再開されたときにのみ呼び出されるため、まったく役に立ちません。
新しいフラグメントを追加するのか、フラグメントトランザクションで既存のフラグメントを置き換えるのかを確認する必要があります。
以前のフラグメントをreplace()
した場合、前のフラグメントに戻ったときに、そのフラグメントが最初から再作成されるため、onCreateView()
が再び呼び出され、ツールバーのタイトルを更新できます。あなたはおそらくすでにしています。
新しいフラグメントをadd()
した場合、前のフラグメントはまだそこにあり、表示されません。戻ったとき、バックスタックから最後のエントリを取得し(フラグメントマネージャーでgetBackStackEntryCount()
およびgetBackStackEntryAt()
を使用)、対応するFragmentオブジェクトを取得します(使用findFragmentByTag()
in the fragment manager)、そのFragmentをすべてのフラグメントが継承するいくつかの基本クラスにキャストし、カスタムメソッドを呼び出します。 onVisible()
、そのフラグメントについて。基本クラスのonVisible()
のデフォルト実装は何もしません。各フラグメントをオーバーライドして、ツールバーのタイトル、FAB、および必要に応じてその他のものを更新します。また、コードの重複を避けるために、onVisible()
からonResume()
を呼び出しています。
このフラグメントのメソッドを使用できます:
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
}
このコードをフラグメントに挿入します。
@Override
public void setUserVisibleHint(boolean visible) {
super.setUserVisibleHint(visible);
if (visible && isResumed()) {
onResume();
}
}
@Override
public void onResume() {
super.onResume();
if (!getUserVisibleHint()) {
return;
}
setData();
}
私はこの方法を使用して、このブロックコードをフラグメントに追加します
requireActivity().supportFragmentManager.addOnBackStackChangedListener {
val fm = requireActivity().supportFragmentManager
fm?.let {
if (it.backStackEntryCount == YOUR_FRAGMENT_BACK_STACK_INDEX) {
// your fragment visible
}
}
}