NavHostFragment
があるアクティビティがあります。アクティビティは、その意図で特定の値を受け取ります。このデータをナビゲーショングラフの最初のフラグメント、つまりstartDestination
に渡します。これに関するドキュメントは見つかりませんでした。
私はすでに SOに関するこの質問 を経験しましたが、navController.getGraph()
のaddDefaultArguments
メソッドを見つけることができません。
バンドルをstartDestination
に渡すことはできますか?
私も同じ問題に遭遇しました、
これは私がそれを解決した方法です:
your_activity.xml
_からのNavHostFragmentのxml設定:つまり、削除app:navGraph = "@ navigation/nav_graphXMLは次のようになります。
_ <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"
/>
_
追加アクティビティの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
_を使用してみてください
私もこの方法を見つけることができません。アーキテクチャコンポーネントのドキュメントには存在しません。
しかし、これは引数を開始宛先に設定する別の方法です。
// Kotlin Code, in Fragment
with(findNavController().graph) {
get(startDestination).addArgument(...)
}
ソースコードを確認したところ、ナビゲーション先と引数に関して多くの変更があることがわかりました。引数を開始先に渡す適切な方法は、次のような「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)
もっと良い方法があるかもしれませんが、私はそれを見つけられませんでした。
ナビゲーション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)
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
}
上記のコードをフラグメント側に追加します