web-dev-qa-db-ja.com

なぜAndroidナビゲーションコンポーネントの画面が以前のフラグメントに戻るのではなく、Previosフラグメントが呼び出された方法のメソッドは?

私は2つのフラグメントコールCreateRoomFragmentDisplayPhotoFragment、ナビゲーショングラフは次のようになります。

_<navigation>    
<fragment
    Android:id="@+id/createRoomFragment"
    Android:name="package.room.CreateRoomFragment"
    Android:label="Create a room"
    tools:layout="@layout/fragment_create_room">
    <action
        Android:id="@+id/action_createRoomFragment_to_roomFragment"
        app:destination="@id/roomFragment" />
    <action
        Android:id="@+id/action_createRoomFragment_to_displayPhotoFragment"
        app:destination="@id/displayPhotoFragment" />
</fragment>

<fragment
    Android:id="@+id/displayPhotoFragment"
    Android:name="package.fragment.DisplayPhotoFragment"
    Android:label="fragment_display_photo"
    tools:layout="@layout/fragment_display_photo" >
    <argument Android:name="bitmap"
              app:argType="Android.graphics.Bitmap"/>
</fragment>
_

そのため、CreateRoomFragmentからDisplayPhotoFragmentへ移動したいときは、以下のようにDOを使用します。

_NavDirections action = CreateRoomFragmentDirections.actionCreateRoomFragmentToDisplayPhotoFragment(selectedPhoto);
Navigation.findNavController(view).navigate(action);
_

これを行うと、DisplayPhotoFragmentに移動できます。

しかし、デバイスのbackボタンを押してツールバーから_Back arrow_を押すと、CreateRoomFragmentに戻ることはできません。

私はこれを試してみました、しかしそれでも以前のフラグメントに戻ることができません:

_requireActivity().getOnBackPressedDispatcher().addCallback(getViewLifecycleOwner(),
                new OnBackPressedCallback(true) {
                    @Override
                    public void handleOnBackPressed() {

                       navController.navigateUp();  //I tried this 
                       navController.popBackStack(R.id.createRoomFragment,false); //and also this
                    }
                });
_

現在のメイン問題:

上記のコードを使用することで、画面は前の断片に戻っていませんでした(CreateRoomFragment)。それはまだDisplayPhotoFragmentでは、CreateRoomFragmentonViewCreatedセクションのAPIメソッドが呼び出されています。

これを引き起こすのは何ですか?そしてどのように私はこの問題を解決することができますか?

7
ken

Android訪問先の宛先を含むバックスタックを維持します。アプリの最初の宛先は、ユーザーがアプリを開くとスタックに置かれます。 navigate()メソッドへの各呼び出しは、スタックの上に別の宛先を置きます。タップアップまたはバックコールNavController.navigateUp()およびNavController.popBackStack()メソッドを呼び出して、スタックから上位の先頭の目的地を削除(またはポップ)します。

NavController.popBackStack()他の宛先に正常に戻ったかどうかを示すブール値を返します。これがfalseを返すときの最も一般的なケースは、グラフの開始先を手動でポップするときです。

メソッドがfalseを返すと、NavController.getCurrentDestination()がNULLを返します。アクティビティでfinish()を呼び出して、新しい宛先に移動するか、またはPOPを処理するかのどちらかを担当します。

アクションを使用して移動するときは、アクションのpopUpTo _とpopUpToInclusiveパラメータを使用して、バックスタックから追加の宛先をポップオフにすることができます。

class MyFragment : Fragment() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val onBackPressedCallback = object : OnBackPressedCallback(true) {
            override fun handleOnBackPressed() {
                if (true == conditionForCustomAction) {
                    CustomActionHere()
                } else  NavHostFragment.findNavController(this@MyFragment).navigateUp();    
        }
    }
    requireActivity().onBackPressedDispatcher.addCallback(
        this, onBackPressedCallback
    )
    ...
}
 _
5
Sanjay Bhalani

私は同じ問題を抱えていました。私にとって、この問題は私が次のフラグメントに行くかを決定するためにLiveData Booleanを使用していたということでした。その後、バック/アップをナビゲートしたとき、ブール値はまだ正しくありませんでしたので、自動的に再度ナビゲートします。

5
Myk

ライブデータを使用してナビゲーションを処理するための最良のソリューションは、SingLeLeLiveEventを使用することです。

MutableVeDataの拡張機能であるこのクラスを常に使用できます。

https://gist.githubusercontent.com/cdmunoz/ebe5c4104DADC2A461F512JA1CA71495/RAW/A17F76754F5C6E6D179535E627/SINGLELIVEREVENT.KT

このチェックの詳細を切り取るために:

https://proandroiddev.com/singLeLiveEvent-to-help-you-work-with-liveData-and-vents-5ac519989c7

1
Tinashe Makuti