web-dev-qa-db-ja.com

Androidナビゲーションアーキテクチャコンポーネント:バンドルデータをstartDestinationに渡す方法

NavHostFragmentがあるアクティビティがあります。アクティビティは、その意図で特定の値を受け取ります。このデータをナビゲーショングラフの最初のフラグメント、つまりstartDestinationに渡します。これに関するドキュメントは見つかりませんでした。

私はすでに SOに関するこの質問 を経験しましたが、navController.getGraph()addDefaultArgumentsメソッドを見つけることができません。

バンドルをstartDestinationに渡すことはできますか?

9
Praveen Singh

私も同じ問題に遭遇しました、

これは私がそれを解決した方法です:

  1. 削除 _your_activity.xml_からのNavHostFragmentのxml設定:つまり、削除app:navGraph = "@ navigation/nav_graph

XMLは次のようになります。

_        <fragment
        Android:id="@+id/nav_Host"
        Android:name="androidx.navigation.fragment.NavHostFragment"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        app:defaultNavHost="true"
        />
_
  1. 追加アクティビティのonCreate()にプログラムでNavHostFragmentを設定します。 NavGraph.addDefaultArguments(bundleData)apiを使用してバンドルデータを渡します

    _    override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.editor_layout)
            setupNavigation()
        }
    
        private fun setupNavigation() {
            val navHostFragment = nav_Host as NavHostFragment
            val navController = navHostFragment.navController
            val navInflater = navController.navInflater
            val graph = navInflater.inflate(R.navigation.nav_graph)
            graph.addDefaultArguments(intent!!.extras!!) // This is where you pass the bundle data from Activity to StartDestination 
            navHostFragment.navController.graph = graph
        }
    _

更新:

私のProject Gradleファイルの依存関係:

_dependencies {

    def nav_version = "1.0.0-alpha08"

    implementation "Android.Arch.navigation:navigation-fragment:$nav_version" // use -ktx for Kotlin
    implementation "Android.Arch.navigation:navigation-ui:$nav_version" // use -ktx for Kotlin}
}
_

注:ナビゲーションコンポーネントバージョン_1.0.0-alpha09_では、何らかの理由でgoogleにメソッドがないため、addDefaultArguments()が間もなく修正される可能性があります。しかし、下位バージョンにはaddDefaultArguments()メソッドがあります。Javaとkotlinの両方でチェックしたので、_1.0.0-alpha07_または_1.0.0-alpha08_を使用してみてください

1
Anmol

私もこの方法を見つけることができません。アーキテクチャコンポーネントのドキュメントには存在しません。

しかし、これは引数を開始宛先に設定する別の方法です。

// Kotlin Code, in Fragment
with(findNavController().graph) {
    get(startDestination).addArgument(...)
}
0
the_dani

ソースコードを確認したところ、ナビゲーション先と引数に関して多くの変更があることがわかりました。引数を開始先に渡す適切な方法は、次のような「addArgument」メソッドを使用することだと思います。

val argument1 = 1 //First value
val argument2 = "Value" //Second value
val navArgument1=NavArgument.Builder().setDefaultValue(argument1).build()
val navArgument2=NavArgument.Builder().setDefaultValue(argument2).build()
navController.getGraph().addArgument("Key1",navArgument1)
navController.getGraph().addArgument("Key2",navArgument2)

もっと良い方法があるかもしれませんが、私はそれを見つけられませんでした。

0
Alex

ナビゲーション1.0.0

        val navHostFragment = root_nav_Host_fragment as NavHostFragment
        val navController = navHostFragment.navController
        val navInflater = navController.navInflater
        val graph = navInflater.inflate(R.navigation.navigation)
        val sectionId = intent.getIntExtra(KEY_SECTION_ID, -1)
        val bundle = bundleOf(KEY_SECTION_ID to sectionId)
        navHostFragment.navController.setGraph(graph, bundle)
0
Ken Zira
class MainActivity : BaseActivity()  {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val navHostFragment = container as NavHostFragment
        val inflater = navHostFragment.navController.navInflater
        val graph = inflater.inflate(R.navigation.main_nav)

        var data : Data  = intent.getParcelableExtra("DATA") as Data
        var bundle : Bundle = Bundle()
        bundle.putParcelable("DATA", data)
        graph.addDefaultArguments(bundle)
        graph.addDefaultArguments(intent!!.extras!!)
        navHostFragment.navController.graph = graph

    }
}

ナビゲーションを使用してデータを送信するためのアクティビティに上記のコードを追加します

override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)

        var data = NavHostFragment.findNavController(this).graph.defaultArguments.getParcelable("DATA") as Booking

}

上記のコードをフラグメント側に追加します

0
Vinil Chandran