Androidナビゲーションコンポーネントの戻るボタンの処理 質問する

Androidナビゲーションコンポーネントの戻るボタンの処理 質問する

ナビゲーション コントローラーを使用して、システムの戻るボタン アクションを適切に処理する方法を知りたいです。アプリには 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}'

おすすめ記事