如何解决Kotlin Navigation 找不到片段
我有多个活动的多个导航图,但我总是在通过 navController 导航到片段时遇到问题。它总是返回这样的错误无法从当前目标目的地中找到
java.lang.IllegalArgumentException: Navigation action/destination com.my.app:id/action_orderDetailFragment_to_driverMapFragment cannot be found from the current destination Destination(com.my.app:id/driverMapFragment) label=fragment_driver_map class=com.my.app.orders.DriverMapFragment
我通过使用 Directions
和 navigate
by ids 等尝试了来自 safeargs 的各种解决方案。它们都以相同的错误告终。处理导航变得令人沮丧
navigation screenshot
Fragment
class OrderDetailFragment : Fragment(),View.OnClickListener {
lateinit var navController: NavController
lateinit var drivermap: Button
override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
super.onViewCreated(view,savedInstanceState)
navController = Navigation.findNavController(view)
view.findViewById<Button>(R.id.drivermap).setOnClickListener(this)
}
// other functions....
// here suppose to redirect to "driverMapFragment" from "orderDetailFragment" along with "Order ID"
override fun onClick(v: View?) {
when(v!!.id) {
R.id.drivermap -> {
// (1) Returning Error
val bundle = bundleOf("orderIDArgument" to orderIDArgument)
navController!!.navigate(R.id.action_orderDetailFragment_to_driverMapFragment,bundle)
// (2) Returning Error
// val action = OrderDetailFragmentDirections.actionOrderDetailFragmentToDriverMapFragment(bundle)
// v.findNavController().navigate(action)
}
}
}
}
PS:为了避免不必要的评论,我必须提到我在 gradle 中确实有安全参数。
app level gradle
apply plugin: "androidx.navigation.safeargs.kotlin"
project level gradle
dependencies {
classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.3.5"
}
更新 1
更新 2
Structure
- 我有 OrdersFragment,其中向用户显示所有订单的列表
- 因为我在从该列表项中获取详细信息片段时遇到了同样的问题,所以我所做的是在此活动中创建名为
OrdersActivity
的新活动,我通过OrderDetailFragment
获取订单详细信息(该活动的主要片段)活动) - 现在
OrdersActivity
有新的片段,我正在尝试显示订单地图(从OrderDetailFragment
重定向到driverMapFragment
)
PS:我知道这个结构有点乱(主要是因为我被迫制作了我不想做的 OrdersActivity
,但同样的问题(错误)让我这样做了.
现在是我的activity_orders.xml
<ScrollView
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:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginBottom="56dp"
android:fillViewport="true"
tools:context=".orders.OrdersActivity">
// by default it loads `OrderDetailFragment` then its supposed to switch to maps fragment when button is clicked inside `OrderDetailFragment`
<androidx.fragment.app.FragmentContainerView
android:id="@+id/orderFragmentId"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/order_detail" />
</ScrollView>
OrdersActivity.kt
class OrdersActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_orders)
// make sure main fragment loads only once
if (savedInstanceState == null) {
supportFragmentManager
.beginTransaction()
.add(R.id.orderFragmentId,OrderDetailFragment())
.commit()
}
}
private fun navigateTo(fragment: Fragment) {
val transaction = supportFragmentManager
.beginTransaction()
.replace(R.id.orderFragmentId,fragment)
transaction.commit()
}
}
解决方法
您正在使用 NavHostFragment
,根本不应使用任何 FragmentTransaction
- 您正在添加 OrderDetailFragment
之外的第二个实例 NavHostFragment
.
从您的 OrdersActivity
中删除所有代码:
class OrdersActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_orders)
}
}
,
您需要将 <action
移到 <fragment
之外,它应该是 <navigation
标记的子级。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。