1. ホーム
  2. android

[解決済み] Android ナビゲーションコンポーネントにおける戻るボタンの扱いについて

2022-08-14 12:19:52

質問

ナビゲーションコントローラーを使用して、システムの戻るボタンのアクションを適切に処理する方法を知りたいです。私のアプリには2つのフラグメント(例:fragment1 と fragment2)があり、fragment1 で fragment2 に移動するアクションがあります。ユーザーがfragment2のシステムバックボタンを押すと、終了を確認するダイアログ(例えばDialogFragmentを使用)を表示したいのですが、1つのことを除いてすべてうまく動作します。この動作を実装するための最良の方法は何でしょうか?もし、私が app:defaultNavHost="true" を使用すると、私のルールを無視して自動的に戻ってしまいます。さらに、このコンポーネントは何のためにあるのでしょうか?

pop to"を使用した方が良いのでしょうか?

どのように解決するのですか?

最新更新情報 - 2019年4月25日

新規リリース androidx.activity ver. 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()
    }
    ...
}

旧アップデート

UPD: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;
    }

非推奨 (バージョン1.0.0-alpha06以降 2019年4月3日):

から これ であるため、単に JetPack 実装 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);
    }
}

UPDです。 あなたのアクティビティは AppCompatActivity または FragmentActivity とGradleファイルに記述します。

 implementation 'androidx.appcompat:appcompat:{lastVersion}'