ナビゲーション コントローラーを使用して、システムの戻るボタン アクションを適切に処理する方法を知りたいです。アプリには 2 つのフラグメント (たとえば、フラグメント 1 とフラグメント 2) があり、フラグメント 1 にはフラグメント 2 への移動先を持つアクションがあります。1 つを除いてすべて正常に動作します。フラグメント 2 でユーザーがシステムの戻るボタンを押したときに、終了を確認するダイアログ (たとえば、DialogFragment を使用) を表示したいのです。この動作を実装する最適な方法は何ですか?app:defaultNavHost="true"
ホスト フラグメントで使用すると、ルールを無視して自動的に戻ります。また、このコンポーネントの目的は何ですか?
「pop to」を使うべきでしょうか?
ベストアンサー1
最新アップデート - 2019年4月25日
新発売androidx.activity バージョン 1.0.0-alpha07いくつかの変化をもたらす
Android公式ガイドの詳細な説明:カスタムの戻るナビゲーションを提供する
例:
public class MyFragment extends Fragment {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// This callback will only be called when MyFragment is at least Started.
OnBackPressedCallback callback = new OnBackPressedCallback(true /* enabled by default */) {
@Override
public void handleOnBackPressed() {
// Handle the back button event
}
};
requireActivity().getOnBackPressedDispatcher().addCallback(this, callback);
// The callback can be enabled or disabled here or in handleOnBackPressed()
}
...
}
古いアップデート
更新日: 2019年4月3日
簡素化されました。詳細情報ここ
例:
requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(), this);
@Override
public boolean handleOnBackPressed() {
//Do your job here
//use next line if you just need navigate up
//NavHostFragment.findNavController(this).navigateUp();
//Log.e(getClass().getSimpleName(), "handleOnBackPressed");
return true;
}
非推奨(2019年4月3日バージョン1.0.0-alpha06以降) :
以来これ、それは単にジェットパックOnBackPressedCallback
フラグメントに実装し、アクティビティに追加します。getActivity().addOnBackPressedCallback(getViewLifecycleOwner(),this);
フラグメントは次のようになります。
public MyFragment extends Fragment implements OnBackPressedCallback {
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getActivity().addOnBackPressedCallback(getViewLifecycleOwner(),this);
}
@Override
public boolean handleOnBackPressed() {
//Do your job here
//use next line if you just need navigate up
//NavHostFragment.findNavController(this).navigateUp();
//Log.e(getClass().getSimpleName(), "handleOnBackPressed");
return true;
}
@Override
public void onDestroyView() {
super.onDestroyView();
getActivity().removeOnBackPressedCallback(this);
}
}
追記:アクティビティは、Gradle ファイルでAppCompatActivity
またはを拡張する必要があります。FragmentActivity
implementation 'androidx.appcompat:appcompat:{lastVersion}'