いくつかのカスタム設定を表示するためにBottomSheetDialogFragmentを使用しています。
要件:
BottomSheetDialogFragmentのいずれかのタブをクリックすると、フラグメントが置き換えられてバックスタックに追加されるため、ユーザーがonBackPressまたはUpアクションをクリックすると、最後の設定のBottomSheetDialogFragmentのフラグメントに戻ります。
トランザクションを簡素化するためにナビゲーションアーキテクチャコンポーネントを使用したいと思います。
問題:ナビゲーションアーキテクチャコンポーネントを使用してFragmentAからBottomSheetDialogFragmentに移動すると、以下のエラーが表示されます。
Java.lang.IllegalStateException:ダイアログはnullであってはなりませんBottomSheetDialogFragment
ナビゲーションアーキテクチャコンポーネントを使用してBottomSheetDialogFragmentをインスタンス化する方法がわからないため、以下のコードを使用すると、ナビゲーションアーキテクチャコンポーネントを使用してバックスタックを維持できなくなります。
BottomSheetDialogFragment.show(FragmentManager manager, String tag)
ナビゲーションコンポーネントバージョン2.1.0-alpha04
、Navigation Graph
には、宛先の1つとしてdialog
を含めることができます。
<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:id="@+id/main_navigation"
app:startDestination="@id/startFragment">
<fragment
Android:id="@+id/loginFragment"
Android:name="com.awesomeproject.Android.authentication.login.LoginFragment"
Android:label="Login"
tools:layout="@layout/login_fragment" />
<dialog
Android:id="@+id/bottomSheet"
Android:name="com.awesomproject.Android.BottomSheetFragment"
tools:layout="@layout/bottom_sheet_dialog_fragment" />
</navigation>
BottomSheetFragmentは、他のBottomSheetに似ています。
class BottomSheetFragment : BottomSheetDialogFragment() {
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View =
inflater.inflate(R.layout.bottom_sheet_dialog_fragment, container, false)
}
その後、他の宛先と同じようにbottomSheet
を扱うことができます。この宛先に移動するか、safeArgs
を渡すことができます。
乾杯!