标签: android-navigation-graph

异常膨胀导航图

我刚刚将 Android Studio 更新到 v3.5 并且我的项目停止运行,给我以下异常:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mcampana.turle/com.mcampana.turle.MainActivity}: android.view.InflateException: Binary XML file line #10: Binary XML file line #10: Error inflating class fragment
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6669)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
 Caused by: android.view.InflateException: Binary XML file line #10: Binary XML file line #10: Error inflating class fragment
 Caused by: android.view.InflateException: Binary XML file line #10: Error inflating class …
Run Code Online (Sandbox Code Playgroud)

android android-navigation-graph

5
推荐指数
1
解决办法
1350
查看次数

将参数传递给嵌套图的 startDestination

我在单独的文件中创建了多个图表。

第一个是GraphA,它包括GraphB。GraphBstartDestinationFragmentB具有名为AnID参数

现在我想将AnIDGraphA传递到GraphB ( FragmentB )

尽管编辑器知道该参数,但生成的代码不考虑该参数:

在此输入图像描述

    val directionB = FragmentADirections.actionFragmentAToGraphB(/* HAS NOT ARGUMENT */)
    findNavController().navigate(directionB)
Run Code Online (Sandbox Code Playgroud)

如何将参数传递给嵌套图?

navigation android android-navigation-graph

5
推荐指数
1
解决办法
1380
查看次数

Android 导航组件:通过特定索引弹出返回堆栈的自循环目的地

我有一个像这样的导航图

导航图

它是一个文件夹/文件列表应用程序,当单击文件夹时,它将通过图形定义的操作导航到具有新实例的同一片段。当我导航到一些文件夹并当前位于文件夹 D 中后,会出现如下所示的按钮面包屑。

根目录 -> 文件夹 A -> 文件夹 B -> 文件夹 C -> 文件夹 D

当我单击面包屑上的文件夹 B 时,如何弹出或导航回返回堆栈中的“文件夹 B”片段?

编辑:导航代码

// Handle click a folder, navigate to new listing fragment
private fun onItemClick(
    adapter: BaseQuickAdapter<Any, BaseViewHolder>,
    view: View,
    position: Int
){
    val item = adapter.getItem(position) as? CloudFile ?: return
    if (item.isDirectory){
        findNavController().navigate(R.id.action_cloudFileListing, bundleOf(ARG_CLOUD_FOLDER to item), getNavOptions())
    }
}

private fun getNavOptions(): NavOptions? {
    return NavOptions.Builder()
        .setEnterAnim(R.anim.enter_from_right)
        .setExitAnim(R.anim.exit_to_left)
        .setPopEnterAnim(R.anim.enter_from_left)
        .setPopExitAnim(R.anim.exit_to_right)
        .build()
}
Run Code Online (Sandbox Code Playgroud)

android android-architecture-components android-architecture-navigation android-navigation-graph

5
推荐指数
0
解决办法
1223
查看次数

为什么 args 类不为导航图片段生成?

我在我的 android 项目中使用导航组件。我启用了 Gradle 的类型安全 args 插件,这里是我的build.gradle(app)文件。

apply plugin: 'com.android.application'
apply plugin: "androidx.navigation.safeargs"
apply plugin: 'com.google.gms.google-services'


android {
   compileSdkVersion 29
   buildToolsVersion "29.0.2"

defaultConfig {
    applicationId "com.example.nibotransporti"
    minSdkVersion 21
    targetSdkVersion 29
    versionCode 1
    versionName "1.0"
    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
 }
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}
dataBinding.enabled = true
compileOptions {
    sourceCompatibility = 1.8
    targetCompatibility = 1.8
};

}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.legacy:legacy-support-core-utils:1.0.0' …
Run Code Online (Sandbox Code Playgroud)

java android android-architecture-navigation android-navigation-graph android-studio-3.6.1

5
推荐指数
1
解决办法
1445
查看次数

带导航图和 1 个活动应用程序的 Kotlin FCM 推送通知

我为我的 Kotlin 应用程序构建了一项 FCM 服务,这是一个活动和多个片段类型的应用程序。我正在使用导航图从一个片段转到下一个片段。我可以看到推送通知用于数据和通知。每个通知都有一个自定义值调用notify_type。我可以在服务中很好地看到并读取这个变量。根据notify_type值,我想打开不同的片段。我想使用导航图控制器打开。有人可以帮我弄清楚需要做什么才能从 FCM 服务打开片段吗?蒂亚!

override fun onMessageReceived(remoteMessage: RemoteMessage?) {

    remoteMessage?.let {
        it.data?.let { itDT ->
            Log.d(TAG, "Message data payload: $itDT")

            val notifyType = itDT["notify_type"]

            when (notifyType) {

                "public_profile" -> {

                    val userId = itDT["user_id"]

                    //need to open public profile fragment sending user id
                    //would normally use this. Obviously doesn't work in a service
                    val navController = it.findNavController()
                    val action = HomeFragmentDirections.actionNavigationHomeToPublicProfileFragment(
                        userId
                    )
                    navController.navigate(action)

                } else -> {

                    Log.d(TAG, "Unsupported notifyType: $notifyType")

                }
            }
        }

        it.notification?.let { …
Run Code Online (Sandbox Code Playgroud)

push-notification android-fragments kotlin firebase-cloud-messaging android-navigation-graph

5
推荐指数
0
解决办法
746
查看次数

来自 Notification 的深层链接 - 如何通过 backstack 向上传递数据?

在我的应用程序中,用户可以选择一个类别,然后在该类别中选择一个项目以最终查看项目详细信息。标准/转发流程是:

SelectCategoryFragment-> SelectItemFragment->ViewItemDetailsFragment

在选择类别时,selectedCatId通过Bundlefrom SelectCategoryFragmentto传递SelectItemFragment

    NavController navController = Navigation.findNavController(v);
    Bundle args = new Bundle();
    args.putLong(SelectItemFragment.ARG_CATEGORY_ID, selectedCatId);
    navController.navigate(R.id.action_nav_categories_to_items, args);
Run Code Online (Sandbox Code Playgroud)

SelectItemFragment然后将使用该getArguments().getLong(ARG_CATEGORY_ID)值来查询和显示所选类别中的相应项目。

这很好用。但是我现在正在尝试在用户点击通知时实现深度链接,将他们直接跳转到ViewItemDetailsFragment一个可以将他们带到SelectItemFragment, then的后台堆栈SelectCategoryFragment

我的问题是,如上所述,SelectItemFragment取决于ARG_CATEGORY_ID传递给它的参数以检索/显示其数据。我已经阅读了深层链接嵌套导航图,但真的不知道如何通过ARG_CATEGORY_ID深层链接/反向堆栈。

当用户按回时,是否有一种整洁的方式可以将数据从 传递ViewItemDetailsFragmentSelectItemFragment

android android-architecture-components android-architecture-navigation android-deep-link android-navigation-graph

5
推荐指数
1
解决办法
620
查看次数

使用 setGraph() 以编程方式设置图表会导致应用程序在进程死亡后无法恢复堆栈 (Jetpack Navigation)

我目前所处的情况是,重构整个应用程序以形成一个更有凝聚力的整体可能是不可行的,但当前使用 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

5
推荐指数
1
解决办法
1716
查看次数

public Final fun actionFragmentAToDetailActivity() 的参数太多

实际上 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

5
推荐指数
1
解决办法
629
查看次数

导航图中的 ClassNotFoundException android

我在 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

5
推荐指数
1
解决办法
656
查看次数

使用 setupWithNavController:2.5.0-alpha01 导致每次调用 OnViewCreated

我使用导航组件和底部导航栏,并为了处理选项卡栏导航,请调用以下代码

绑定.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

5
推荐指数
1
解决办法
624
查看次数