私は2つのフラグメントコールCreateRoomFragment
とDisplayPhotoFragment
、ナビゲーショングラフは次のようになります。
_<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
では、CreateRoomFragment
onViewCreated
セクションのAPIメソッドが呼び出されています。
これを引き起こすのは何ですか?そしてどのように私はこの問題を解決することができますか?
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
)
...
}
_
私は同じ問題を抱えていました。私にとって、この問題は私が次のフラグメントに行くかを決定するためにLiveData Booleanを使用していたということでした。その後、バック/アップをナビゲートしたとき、ブール値はまだ正しくありませんでしたので、自動的に再度ナビゲートします。
ライブデータを使用してナビゲーションを処理するための最良のソリューションは、SingLeLeLiveEventを使用することです。
MutableVeDataの拡張機能であるこのクラスを常に使用できます。
このチェックの詳細を切り取るために:
https://proandroiddev.com/singLeLiveEvent-to-help-you-work-with-liveData-and-vents-5ac519989c7