jcb*_*ird 2 android kotlin android-navigation android-safe-args
我已经实现了一个在 nav_graph 中的片段之间传递的参数,但是当我尝试在原始片段中设置参数时,NavDirections 找不到该参数。
请注意,在尝试传递参数之前,导航工作正常。
如果我执行 Clean Project,我会丢失 NavDirections。如果我进行重建,我将失去论点。
摇篮:应用程序
//Navigation
implementation "androidx.navigation:navigation-fragment-ktx:$nav_version"
implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
apply plugin: "androidx.navigation.safeargs.kotlin"
Run Code Online (Sandbox Code Playgroud)
导航图.xml
<fragment
android:id="@+id/destination_home"
android:name="com.android.joncb.flightlogbook.HomeFragment"
android:label="@string/lblHome"
tools:layout="@layout/fragment_home">
<action
android:id="@+id/action_home_to_fltHistory"
app:destination="@id/destination_fltHistory" />
<action
android:id="@+id/action_home_to_stats"
app:destination="@id/destination_statistics" />
<action
android:id="@+id/action_home_to_newFlight"
app:destination="@id/destination_newFlight" />
<action
android:id="@+id/action_home_to_fltDetails"
app:destination="@id/destination_fltDetails" />
<argument
android:name="fltData"
app:argType="string" />
</fragment>
Run Code Online (Sandbox Code Playgroud)
在我的 Home Fragment 中,我收到错误“Unresolved reference: fltData”
card_nextFlight.setOnClickListener {
val actionDetails = HomeFragmentDirections.actionHomeToFltDetails()
actionDetails.fltData ( flightData.toString())
Navigation.findNavController(it).navigate(actionDetails)
}
Run Code Online (Sandbox Code Playgroud)
flightData 是一个数据类
data class FlightDTO(
var airlineName: String, var faCode: String, var fltNo: String, var aircraft: String,
var depAP: String, var arrAP: String, var schedDep: String, var schedArr: String,
var date: String, var leg: Int = 0, var actDep: String = "", var actArr: String = "" ){
...
override fun toString(): String {
return "$airlineName $faCode $fltNo $aircraft $depAP $schedDep $arrAP $schedDep $date"
}
}
Run Code Online (Sandbox Code Playgroud)
我想通过使类 Parcelable 理想地通过类,但是在我可以传递一个字符串之前,冒险沿着包裹线是没有意义的。
你写错了你的 XML,这样想:我构造我的 XML 属性的方式是生成的代码在目的地之间看起来和接收的方式......
所以基本上在你的 nav_graph.xml 你应该改为:
<fragment
android:id="@+id/destination_home"
android:name="com.android.joncb.flightlogbook.HomeFragment"
android:label="@string/lblHome"
tools:layout="@layout/fragment_home">
<action
android:id="@+id/action_home_to_fltHistory"
app:destination="@id/destination_fltHistory" />
<action
android:id="@+id/action_home_to_stats"
app:destination="@id/destination_statistics" />
<action
android:id="@+id/action_home_to_newFlight"
app:destination="@id/destination_newFlight" />
<action
android:id="@+id/action_home_to_fltDetails"
app:destination="@id/destination_fltDetails">
<argument
android:name="fltData"
app:argType="string" />
</action>
</fragment>
Run Code Online (Sandbox Code Playgroud)
在你的目的地,它应该是这样的:
<fragment
android:id="@+id/destination_fltDetails"
android:name="com.android.joncb.flightlogbook.FlightDetailsFragment"
android:label="@string/lblFlightDetails"
tools:layout="@layout/fragment_flight_details">
<argument
android:name="fltData"
app:argType="string" />
</fragment>
Run Code Online (Sandbox Code Playgroud)
并在您的航班详细信息片段中,使用以下方法接收属性:
private val args: FlightDetailsFragmentArgs by navArgs()
println(args.fltData) // prints the navigation data
Run Code Online (Sandbox Code Playgroud)
更新:
忘了在你的 Home 片段中提到你的 OnClickListener ,它看起来更像这样:
card_nextFlight.setOnClickListener {
val actionDetails = HomeFragmentDirections.actionHomeToFltDetails(flightData.toString())
Navigation.findNavController(it).navigate(actionDetails)
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1421 次 |
最近记录: |