我使用导航组件并使用深层链接来传递值或更改页面 我可以传递原始对象和枚举对象 我从不尝试通过深层链接传递 Parcelable 对象 这可能吗?
我有一个片段,我在其中定义了一个 NavHostFragment,如下所示:
<fragment
android:id="@+id/shipping_host_nav"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/shipping_nav_graph"
app:defaultNavHost="true"/>
Run Code Online (Sandbox Code Playgroud)
当试图在片段中调用 findNavController 方法时,它抛出了一个非法状态异常,并说我的视图组没有 NavController。
java.lang.IllegalStateException: View androidx.core.widget.NestedScrollView{1dd5506 VFED..... ......I. 0,0-0,0} does not have a NavController set
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:我可以在另一个片段中定义一个 NavHostFragment 吗?还是只适合活动? 我已经搜索了很多找到我可以在另一个片段中定义一个导航主机片段,但我没有找到任何答案。
android android-navigation android-architecture-navigation android-navigation-graph
我正在以编程方式NavHostFragment为应用程序的每个功能插入一个。每个NavHostFragment都有自己的导航图。Dagger 通过使用FragmentFactory特定于每个功能来提供它们。它是具有 MVVM 架构的单一活动结构。
回购:https : //github.com/mitchtabian/DaggerMultiFeature/tree/nav-component-backstack-bug
签出分支“nav-component-backstack-bug”。
当导航到图表中时,片段不会被添加到 backstack 中。添加的唯一片段是最近访问过的片段。因此堆栈大小始终保持为 1。
最初我认为这是因为我没有将 设置FragmentFactory为 ,ChildFragmentManager但这并没有改变任何东西。有关相关代码,请参阅下面的代码片段。或者签出项目并运行它。我有日志打印出当前在 backstack 中的片段ChildFragmentManager和SupportFragmentManager. 两者的大小都是 1。
Feature1NavHostFragment.kt
这是习俗之一NavHostFragment。create()伴随对象中的函数是我创建它们的方式。
class Feature1NavHostFragment
@Inject
constructor(
private val feature1FragmentFactory: Feature1FragmentFactory
): NavHostFragment(){
override fun onAttach(context: Context) {
((activity?.application) as BaseApplication)
.getAppComponent()
.feature1Component()
.create()
.inject(this)
childFragmentManager.fragmentFactory = feature1FragmentFactory
super.onAttach(context)
}
companion object{
const val KEY_GRAPH_ID = "android-support-nav:fragment:graphId"
@JvmStatic …Run Code Online (Sandbox Code Playgroud) android android-fragments android-navigation android-architecture-navigation android-navigation-graph
我有一个Activity应用程序。我创建了一个Navigation graph包含所有可能目的地的单个(Fragment )。
唯一Activity layout包含一个<fragment/>容器,因为它应该是。
有一个主要片段包含BottomNavigationView用户可以导航到所有重要目的地(其中 3 个)的位置。
当我按照BottomNavigationView官方文档中的许多教程或事件中所述实现 时,它会替换Activity. 因此,BottomNavigationView不再显示 ,因为它包含在 a 中Fragment而不是 中Activity。我想让它向右膨胀layout我希望它能够使主片段中的
我应该使用另一个Navigation graph特定于主片段的吗?我应该使用经典Listener(但我会失去使用经典的所有兴趣Navigation graph)?有我不知道的解决方案吗?
我该如何实施?我尝试创建两个不同的Navigation graph,但无法将其设置为我的BottomNavigationView
android bottomnavigationview android-architecture-navigation android-navigation-graph
由于两个片段之间的工具栏中的后退按钮的实现困难,我决定开始熟悉Navigation Graph。但我收到一个错误
Views added to a FragmentContainerView must be associated with a Fragment. View android.widget.RelativeLayout{...} is not associated with a Fragment.
这是 .xml 文件,其中包含nav_host_fragment:
<?xml version="1.0" encoding="utf-8"?>
<layout ...
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="androidx.navigation.fragment.NavHostFragment"
app:navGraph="@navigation/nav_graph"
app:defaultNavHost="true">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorBlack"
android:clickable="@{viewModel.isSearching ? false : true}"
android:focusable="@{viewModel.isSearching ? false : true}">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recent_recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="4dp"
android:layout_marginTop="4dp"
android:layout_marginEnd="4dp"
android:layout_marginBottom="4dp"
android:background="@color/colorBlack"
tools:itemCount="10"
tools:listitem="@layout/search_user_layout" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/search_recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginStart="4dp"
android:layout_marginTop="4dp"
android:layout_marginEnd="4dp"
android:layout_marginBottom="4dp"
android:background="@color/colorBlack"
android:visibility="gone"
tools:itemCount="10"
tools:listitem="@layout/search_user_layout" />
<ProgressBar
android:id="@+id/loading"
android:layout_width="48dp"
android:layout_height="48dp" …Run Code Online (Sandbox Code Playgroud) 我的问题是,当我尝试使用底部导航更改片段时,它会起作用,但在一种情况下除外。我有 5 个片段,当我进入第 3 个片段并进入第 5 个片段后,第 5 个片段的图标 don\xc2\xb4t 改变了它的颜色。之后,当我进行另一次导航时,应用程序崩溃并给出下一个错误:
\njava.lang.IndexOutOfBoundsException: fromIndex = -1\n at java.util.ArrayList.subListRangeCheck(ArrayList.java:1014)\n at java.util.ArrayList.subList(ArrayList.java:1008)\n at androidx.navigation.fragment.FragmentNavigator.popBackStack(FragmentNavigator.kt:80)\n at androidx.navigation.NavController.popBackStackInternal(NavController.kt:275)\n at androidx.navigation.NavController.popBackStackInternal(NavController.kt:558)\n at androidx.navigation.NavController.navigate(NavController.kt:1682)\n at androidx.navigation.NavController.navigate(NavController.kt:1541)\n at androidx.navigation.NavController.navigate(NavController.kt:1468)\n at androidx.navigation.ui.NavigationUI.onNavDestinationSelected(NavigationUI.kt:92)\n at androidx.navigation.ui.NavigationUI.setupWithNavController$lambda-6(NavigationUI.kt:602)\n at androidx.navigation.ui.NavigationUI.$r8$lambda$6wzEv9QqEZKdQFS1sQQy-bdQvgE(Unknown Source:0)\n at androidx.navigation.ui.NavigationUI$$ExternalSyntheticLambda2.onNavigationItemSelected(Unknown Source:2)\n at com.google.android.material.navigation.NavigationBarView$1.onMenuItemSelected(NavigationBarView.java:295)\n at androidx.appcompat.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:834)\n at androidx.appcompat.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:158)\n at androidx.appcompat.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:985)\n at com.google.android.material.navigation.NavigationBarMenuView$1.onClick(NavigationBarMenuView.java:133)\n at android.view.View.performClick(View.java:7520)\n at android.view.View.performClickInternal(View.java:7489)\n at android.view.View.access$3600(View.java:826)\n at android.view.View$PerformClick.run(View.java:28555)\n at android.os.Handler.handleCallback(Handler.java:938)\n at android.os.Handler.dispatchMessage(Handler.java:99)\n at android.os.Looper.loop(Looper.java:233)\n at android.app.ActivityThread.main(ActivityThread.java:8010)\n at java.lang.reflect.Method.invoke(Native Method)\n at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:631)\n at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:978)\nRun Code Online (Sandbox Code Playgroud)\n但是,如果之前我单击了第 5 个片段并转到第 3 …
android android-navigation android-navigationview android-navigation-bar android-navigation-graph
我目前所处的情况是,重构整个应用程序以形成一个更有凝聚力的整体可能是不可行的,但当前使用 Jetpack Navigation 的方法正在导致崩溃。
该应用程序有多个图表,为了简单起见,我们将它们称为:
图A、
图B、
图C
图形 A 通过app:navGraph在活动布局中设置,如果它仍然是唯一使用的图形,则应用程序可以并将在进程死亡后恢复其状态。
然而,在某些时刻,应用程序通过使用 FragmentContainerView 的 navController 并使用提供的新图形 id调用setGraph(graphResId: Int)以编程方式切换图形。在此之前,也使用手动膨胀图表。
设置图表的两种方法都会导致进程死亡后第一次重新启动后崩溃,并抛出异常:
Unable to start activity ComponentInfo{com.appname.dev/com.appname.activity.MainActivity}: java.lang.IllegalStateException: Restoring the Navigation back stack failed: destination com.appname.dev:id/graph_b cannot be found from the current destination null
Run Code Online (Sandbox Code Playgroud)
异常发生在MainActivity onCreate调用super.onCreate()
我能想到的唯一解决方案是将其他图形包含在第一个图形中,使用操作导航到其他图形,从而避免切换图形。然而,由于申请的制作方式,最终可能会非常耗时。
我想知道我是否错过了可以调解这次崩溃的重要步骤。
android android-fragments kotlin android-jetpack-compose android-navigation-graph
实际上 DetailActivity(需要传递参数)存在于库模块中,我需要从应用程序(FragmentA)启动它,但我收到构建错误,如下所示:
Too many arguments for public final fun actionFragmentAToDetailActivity()
Run Code Online (Sandbox Code Playgroud)
我正在使用 SafeArgs 库来传递数据。
片段A
findNavController().navigate(
FragmentADirections.actionFragmentAToDetailActivity(
"id",
"name"
)
)
Run Code Online (Sandbox Code Playgroud)
nav_graph_app.xml(存在于应用程序模块中)
<navigation
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:id="@+id/fragment_a_navigation"
app:startDestination="@id/fragmentA">
<fragment
android:id="@+id/fragmentA"
android:name="com.abhishek.fragmentA"
android:label="WeeklyWorkListFragment"
tools:layout="@layout/fragment_a">
<action
android:id="@+id/action_fragmentA_to_DetailActivity"
app:destination="@id/detail_activity" />
</fragment>
</navigation>
Run Code Online (Sandbox Code Playgroud)
nav_graph_common_component.xml(存在于库项目中,作为库模块包含在应用程序的 build.gradle 中)
<navigation
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/common_component_navigation"
<activity
android:id="@+id/detail_activity"
android:name="com.components.DetailActivity"
android:label="DetailActivity"
tools:layout="@layout/activity_detail">
<argument
android:name="id"
app:argType="string" />
<argument
android:name="name"
app:argType="string" />
</activity>
</navigation>
Run Code Online (Sandbox Code Playgroud)
任何帮助或指导将不胜感激。
android android-architecture-navigation android-safe-args android-navigation-graph
我在 firebase 上看到了这个崩溃,并且在相同操作系统的模拟器中无法重现。不知道是什么原因造成的。三星 M32 OS 11 发生崩溃。
崩溃是
Caused by java.lang.RuntimeException: java.lang.ClassNotFoundException: com.octave.data.offer.Classes
Run Code Online (Sandbox Code Playgroud)
这是导航图
<navigation 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:id="@+id/offer_nav_graph"
app:startDestination="@id/offersFragment">
<fragment
android:id="@+id/availableOfferDetailFragment"
android:name="com.octave.offers.available.detail.AvailableOfferDetailFragment"
android:label="fragment_available_offer_detail"
tools:layout="@layout/fragment_available_offer_detail">
<action
android:id="@+id/action_availableOfferDetailFragment_to_applyOfferFragment"
app:destination="@id/applyOfferFragment">
<argument
android:name="classes"
app:argType="com.octave.data.offer.Classes[]" />
<argument
android:name="paymentPlans"
app:argType="com.octave.data.offer.PaymentPlan[]" />
<argument
android:name="offerName"
app:argType="string" />
</action>
</fragment></navigation>
Run Code Online (Sandbox Code Playgroud)
我的数据类如下
@Parcelize
data class Classes(
val id: Int,
val name: String,
val totalEquity: Int,
val reservedEquity: Int,
val expectedReturn: Float,
val subscribed: Int
):Parcelable
@Parcelize
data class PaymentPlan(
val id: String?=null,
val name: String,
var payment: Int,
val …Run Code Online (Sandbox Code Playgroud) android classnotfoundexception kotlin android-navigation android-navigation-graph
我使用导航组件和底部导航栏,并为了处理选项卡栏导航,请调用以下代码
绑定.bottomNavigationView.setupWithNavController(navController)
在上一个版本之前,我在使用 setupWithNavController() 时保存每个片段的状态时遇到了一个大问题,但是由于最新版本的导航 API(>=:2.4.0),它支持多个返回堆栈,我可以轻松在选项卡之间导航,无需担心再次加载所有数据。
但我发现每次导航每个选项卡时,都会调用 OnViewCreated 函数!这给我带来了一些问题。
例如,OnViewCreated是一个使用repeatOnLifeCycle来收集流量的地方,而OnViewCreated的这种重复调用导致了很多流量的订阅者!
甚至在文件中说:
最佳实践是在生命周期初始化时调用此函数。例如,Activity 中的 onCreate 或 Fragment 中的 onViewCreated。否则,可能会创建多个重复执行相同操作的协程并同时执行。
它假定 OnViewCreated 是一个被调用一次的地方!
明显的问题是,首先,这种行为是一个问题还是预期的?如果是预期的话,我们可以在哪里收集流量?请详细说明为什么会发生这种情况?
android android-navigation android-bottomnav android-navigation-graph