为什么我会得到这个例外?
05-18 20:29:38.044: ERROR/AndroidRuntime(5453): java.lang.IllegalArgumentException: The key must be an application-specific resource id.
05-18 20:29:38.044: ERROR/AndroidRuntime(5453): at android.view.View.setTag(View.java:7704)
05-18 20:29:38.044: ERROR/AndroidRuntime(5453): at com.mypkg.viewP.inflateRow(viewP.java:518)
Run Code Online (Sandbox Code Playgroud)
有问题的一行是:
((Button) row.findViewById(R.id.btnPickContact)).setTag(TAG_ONLINE_ID,objContact.onlineid);
Run Code Online (Sandbox Code Playgroud)
我把它定义为:
private static final int TAG_ONLINE_ID = 1;
Run Code Online (Sandbox Code Playgroud) 我有一个片段 A、B、C。从 A -> B 导航时没问题,但从 B -> C 时它崩溃了。
这是我的导航
这是我的导航代码
categoryProductItemListAdapter.setOnItemClickListener {
val action = CategoryProductItemsDirections.actionCategoryProductItems2ToProductItem(null, it)
navController = Navigation.findNavController(requireView())
navController?.navigateUp()
navController?.navigate(action)
}
Run Code Online (Sandbox Code Playgroud)
这是 productItem 目的地的 XML 代码
<fragment
android:id="@+id/categoryProductItems2"
android:name="com.sample.store.main.dashboard.ui.ui.home.categoryitems.CategoryProductItems"
android:label="CategoryProductItems"
tools:layout="@layout/fragment_category_product_items">
<argument
android:name="category_global"
app:argType="com.sample.store.data.globalmodels.response.categories.Category" />
<action
android:id="@+id/action_categoryProductItems2_to_productItem"
app:destination="@id/productItem"
app:enterAnim="@anim/enter_from_right"
app:exitAnim="@anim/exit_to_right"
app:popEnterAnim="@anim/fragment_open_enter"
app:popExitAnim="@anim/fragment_fade_exit" />
</fragment>
Run Code Online (Sandbox Code Playgroud)
这是错误:
java.lang.IllegalArgumentException: Navigation action/destination com.sample.store.full:id/action_categoryProductItems2_to_productItem cannot be found from the current destination Destination(id/navigation_home) label=Home class=com.sample.store.main.dashboard.ui.ui.home.mainui.HomeFragment
Run Code Online (Sandbox Code Playgroud)
我不知道发生了什么,但似乎 navController 正在寻找“navigation_home”
使用viewpager进行导航有什么用?我找不到有关此信息,也无法理解该如何做。
我有一个简单的两个片段,需要放入viewpager内,如果可能的话,可以通过导航。
我最近切换到Android导航,但是遇到了很多情况(在代码的不同部分),我得到:
Fatal Exception: java.lang.IllegalArgumentException
navigation destination com.xxx.yyy:id/action_aFragment_to_bFragment is unknown to this NavController
Run Code Online (Sandbox Code Playgroud)
在每种情况下,代码都是简单的调用,例如:
findNavController(this, R.id.navigation_host_fragment).navigate(R.id.action_aFragment_to_bFragment)
Run Code Online (Sandbox Code Playgroud)
通常是响应按钮按下。
目前尚不清楚为什么会引发此错误。我目前的怀疑是,onClickListener在某些设备上被某种程度上调用了两次,从而导致导航被第二次调用(导致当时处于错误状态)。引起这种怀疑的原因是,这似乎最经常发生在某些情况下,即在导航调用之前可能会有“长时间”运行的操作。但是,我无法在自己的设备上重新创建它。
关于如何避免此问题的想法(或者实际上,是该问题的真正根本原因是什么)?
我不想使用全局动作;我对向堆栈引入更多意外状态持谨慎态度。而且,我真的希望不必在每次进行导航调用时都尝试测试当前状态。
今天我开始使用 Android 的导航组件在我的应用程序中实现身份验证流程。这个想法很简单:用户启动应用程序,如果她通过了身份验证,它会显示一个 UI,如果她没有通过身份验证,则显示另一个 UI。
我所做的是在我HomeFragment的onViewCreated方法,我检查,如果用户通过验证后,如果她不是我叫NavController的navigate()通过传递,将导航到一个动作的标识方法AuthenticationFragment。一切正常,直到用户在 中单击后退按钮AuthenticationFragment,因为然后我收到此错误。我仍然不知道该错误的实际原因是什么,但是导航发生得太快的想法似乎与我的情况相似:目的地首先从 切换AuthenticationFragment到HomeFragment然后立即从切换HomeFragment到AuthenticationFragment再次,因为HomeFragment再次发现用户未通过身份验证.
尽管我遇到了错误,但这种方法对我来说仍然是错误的。HomeFragment在她进行身份验证之前,用户不应该能够返回到(并且在片段立即来回切换时看到屏幕闪烁)。我还查看了这个Android 的官方实现身份验证流程指南,但对我来说这似乎也是错误的,因为那里涉及到多余的第三部分 UI(MainFragment)。在我的情况下,我可以用闪屏替换它,但它仍然会留在后堆栈中,用户将能够返回闪屏,这显然是无稽之谈。
那么使用 Android 的新导航组件实现身份验证流程的正确方法是什么?我想要的功能是:如果用户未通过身份验证,那么她将被重定向到身份验证 UI,如果她从那里按下后退按钮,她应该退出应用程序。
更新:我知道我可以只收听 back press 事件并从那里关闭应用程序,但我仍然希望有一些使用 Android 导航组件的优雅解决方案。
authentication android android-jetpack android-architecture-navigation
我在我的应用程序中使用了导航组件,最近它可以正常工作,但是将项目更新为更新后,仅当该目标位置(我将要打开)已使用自身关闭时才AndroidX出现错误。另外,如果我从中关闭DESTINATION片段也没有错误,但是使用只能从自身关闭片段。像下面navigation destination DESTINATION_NAME is unknown to this NavController navController.popBackStack()MainActivitypopBackStack
DestinationFragment
viewModelOfActivity.handleBackButton.observe(this, Observer {
Navigation.findNavController(requireActivity(), R.id.main_nav_host).popBackStack()
//CALLING popBackStack() HERE CAUSING PROBLEM WHEN REOPNING THIS DESTINATION(or frg ) AGIAN
})
Run Code Online (Sandbox Code Playgroud)
主要活动
override fun onBackPressed() {
if (myViewModel.isDefaultBehaviour.value == true) {
super.onBackPressed()
} else{
myViewModel.handleBackButton.value=true
//NO ERROR IF HANDLE BACK BUTTON HERE ie->findNavController(R.id.main_nav_host).popBackStack()
//INSTEAD OF myViewModel.handleBackButton
}
}
Run Code Online (Sandbox Code Playgroud)
我还检查相关的问题,但没有任何帮助类似的问题。
注意:我正在使用最新版本的导航库(alpha05)
android android-architecture-components android-jetpack android-architecture-navigation
在我的项目中,我使用来自 google 示例的“带有 5 个不同导航图”的导航扩展类来处理我项目中的底部导航栏导航。
谷歌例子:https : //github.com/android/architecture-components-samples/tree/master/NavigationAdvancedSample。
我想在多个图表中导航到片段 A。
“现在我收到这个错误:导航目标 action_compareListFragment_to_productPageFragment 对这个 NavController 来说是未知的”
日志猫:
2019-11-26 10:34:02.502 6094-6094/com..app E/AndroidRuntime: FATAL EXCEPTION: main
Process: com..app, PID: 6094
java.lang.IllegalArgumentException: navigation destination com..app:id/action_compareListFragment_to_productPageFragment is unknown to this NavController
at androidx.navigation.NavController.navigate(NavController.java:863)
at androidx.navigation.NavController.navigate(NavController.java:804)
at androidx.navigation.NavController.navigate(NavController.java:790)
at com..app.views.home.accountPage.FavoriteFragment.onGoToProductClicked(FavoriteFragment.java:68)
at com..app.databinding.FavoriteListItemBindingImpl._internalCallbackOnClick(FavoriteListItemBindingImpl.java:365)
at com..app.generated.callback.OnClickListener.onClick(OnClickListener.java:11)
at android.view.View.performClick(View.java:6256)
at android.view.View$PerformClick.run(View.java:24701)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Run Code Online (Sandbox Code Playgroud)
我该如何处理这种情况?
如果有人帮助我,我将不胜感激。
android android-jetpack android-architecture-navigation android-jetpack-navigation
我有一个使用导航组件构建的应用程序。我的图表中有一个字段,单击工具栏上的过滤器图标后,该字段会向上滑动底部工作表对话框片段。但是,如果我非常快速地双击工具栏过滤器图标,或者非常快速地单击工具栏过滤器图标和任何与其关联的导航的其他视图,我的应用程序将崩溃并显示以下错误消息:
java.lang.IllegalArgumentException: navigation destination com.th3pl4gu3.locky:id/action_Fragment_Card_to_Fragment_View_Card is unknown to this NavController
Run Code Online (Sandbox Code Playgroud)
下面是我的工具栏过滤器图标的代码示例。
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) {
R.id.Toolbar_Filter -> {
findNavController().navigate(CardFragmentDirections.actionFragmentCardToBottomSheetFragmentCardFilter())
true
}
else -> false
}
}
Run Code Online (Sandbox Code Playgroud)
这是导航架构组件的正常行为吗?
如果没有,您能为我提供修复吗?
android kotlin android-architecture-navigation android-jetpack-navigation android-bottomsheetdialog
我正在我当前正在从事的项目中使用导航组件。问题是,当我同时单击两个项目时,会导致findNavController.navigate()被调用两次。所以它抛出IllegalArgumentException: navigation destination is unknown to this NavController. 我认为它会到达目的地,然后尝试在没有目标目的地的目的地中第二次触发。目的地接待...
有没有办法检查当前片段是否已指定目的地?
现在我已经用下面的代码解决了问题,但它看起来不正确。
fun NavController.navigateSafe(direction: NavDirections) {
try {
navigate(direction)
} catch (exception: IllegalArgumentException) {
Log.e("NavigationExtensions", exception.message.orEmpty())
}
}
Run Code Online (Sandbox Code Playgroud)
更新
感谢@Md.Asaduzzaman 分享的链接帮助了我。解决方案是;
fun NavController.navigateSafe(direction: NavDirections) {
currentDestination?.getAction(direction.actionId)?.let { navigate(direction) }
}
Run Code Online (Sandbox Code Playgroud) navigation android android-jetpack android-architecture-navigation
android ×10
android-architecture-navigation ×7
android-architecture-components ×2
kotlin ×2
double-click ×1
navigation ×1