web-dev-qa-db-ja.com

ナビゲーションアーキテクチャコンポーネントを使用してBottomSheetDialogFragmentを作成する方法

いくつかのカスタム設定を表示するためにBottomSheetDialogFragmentを使用しています。

要件:

BottomSheetDialogFragmentのいずれかのタブをクリックすると、フラグメントが置き換えられてバックスタックに追加されるため、ユーザーがonBackPressまたはUpアクションをクリックすると、最後の設定のBottomSheetDialogFragmentのフラグメントに戻ります。

トランザクションを簡素化するためにナビゲーションアーキテクチャコンポーネントを使用したいと思います。

問題:ナビゲーションアーキテクチャコンポーネントを使用してFragmentAからBottomSheetDialogFragmentに移動すると、以下のエラーが表示されます。

Java.lang.IllegalStateException:ダイアログはnullであってはなりませんBottomSheetDialogFragment

ナビゲーションアーキテクチャコンポーネントを使用してBottomSheetDialogFragmentをインスタンス化する方法がわからないため、以下のコードを使用すると、ナビゲーションアーキテクチャコンポーネントを使用してバックスタックを維持できなくなります。

BottomSheetDialogFragment.show(FragmentManager manager, String tag)
16
Anmol

ナビゲーションコンポーネントバージョン2.1.0-alpha04Navigation 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を渡すことができます。

乾杯!

19
Boonya Kitpitak