标签: android-architecture-navigation

Unable to load class AndroidComponentsExtension after upgrading the Android Gradle Plugin 7.1

I recently downloaded Android Studio Bumblebee and it helpfully asked whether I wanted to upgrade to Android Gradle Plugin 7.1.0, the version that shipped alongside Android Studio Bumblebee.

After upgrading, I get a build error:

Unable to load class 'com.android.build.api.extension.AndroidComponentsExtension'.

This is an unexpected error. Please file a bug containing the idea.log file.
Run Code Online (Sandbox Code Playgroud)

And looking at the idea.log file, I see:

A problem occurred evaluating project ':main'.
    at org.gradle.initialization.exception.DefaultExceptionAnalyser.transform(DefaultExceptionAnalyser.java:103)
    ...
Caused by: org.gradle.api.GradleScriptException: A problem occurred evaluating project ':main'.
    at …
Run Code Online (Sandbox Code Playgroud)

android android-gradle-plugin firebase-performance android-architecture-navigation android-safe-args

150
推荐指数
4
解决办法
6万
查看次数

如何在导航到Android中的另一个片段后清除导航堆栈

我正在使用Android中的新导航架构组件,我在移动到新片段后陷入清理导航堆栈.

示例:我在loginFragment中,当我导航到主片段时,我希望从堆栈中清除此片段,以便用户在按下后退按钮时不会返回到loginFragment.

我正在使用一个简单的NavHostFragment.findNavController(Fragment).navigate(R.id.homeFragment)进行导航.

现行代码:

mAuth.signInWithCredential(credential)
            .addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.homeFragment);
                    } else {
                        Log.w(TAG, "signInWithCredential:failure", task.getException());
                    }
                }
            });
Run Code Online (Sandbox Code Playgroud)

我尝试在navigate()中使用NavOptions,但后退按钮仍然将我发送回loginFragment

NavOptions.Builder navBuilder = new NavOptions.Builder();
NavOptions navOptions = navBuilder.setPopUpTo(R.id.homeFragment, false).build();   
             NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.homeFragment, null, navOptions);
Run Code Online (Sandbox Code Playgroud)

android android-fragments android-architecture-components android-architecture-navigation

64
推荐指数
11
解决办法
3万
查看次数

java.lang.IllegalArgumentException:此NavController未知导航目标xxx

当我尝试从一个片段导航到另一个片段时,我遇到了新的Android导航架构组件的问题,我得到了这个奇怪的错误:

java.lang.IllegalArgumentException: navigation destination XXX
is unknown to this NavController
Run Code Online (Sandbox Code Playgroud)

每个其他导航工作正常,除了这个特定的导航

我用:

findNavContoller()
Run Code Online (Sandbox Code Playgroud)

Fragment的扩展功能可以访问navControler.

任何帮助将不胜感激.

android android-architecture-navigation

58
推荐指数
13
解决办法
2万
查看次数

Android Jetpack导航,使用Youtube或Instagram的BottomNavigationView,如正确的后退导航(片段后退堆栈)?

Android Jetpack导航,BottomNavigationView在后退按钮上点击自动片段后栈?

我想要的是,在用户一个接一个地选择多个标签后,用户点击后退按钮应用必须重定向到他/她打开的最后一页.

通过在ArrayList中保存当前选定的项目,我使用Android ViewPager实现了相同的功能.Android Jetpack导航发布后是否有任何自动后退堆栈?我想用导航图实现它

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".main.MainActivity">

    <fragment
        android:id="@+id/my_nav_host_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:defaultNavHost="true"
        app:layout_constraintBottom_toTopOf="@+id/navigation"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/nav_graph" />

    <android.support.design.widget.BottomNavigationView
        android:id="@+id/navigation"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="0dp"
        android:layout_marginEnd="0dp"
        android:background="?android:attr/windowBackground"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:menu="@menu/navigation" />

</android.support.constraint.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)

navigation.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/navigation_home"
        android:icon="@drawable/ic_home"
        android:title="@string/title_home" />

    <item
        android:id="@+id/navigation_people"
        android:icon="@drawable/ic_group"
        android:title="@string/title_people" />

    <item
        android:id="@+id/navigation_organization"
        android:icon="@drawable/ic_organization"
        android:title="@string/title_organization" />

    <item
        android:id="@+id/navigation_business"
        android:icon="@drawable/ic_business"
        android:title="@string/title_business" />

    <item
        android:id="@+id/navigation_tasks"
        android:icon="@drawable/ic_dashboard"
        android:title="@string/title_tasks" />

</menu>
Run Code Online (Sandbox Code Playgroud)

还补充道

bottomNavigation.setupWithNavController(Navigation.findNavController(this, R.id.my_nav_host_fragment))
Run Code Online (Sandbox Code Playgroud)

我得到了一个答案Levi …

android android-navigation bottomnavigationview android-architecture-components android-architecture-navigation

50
推荐指数
7
解决办法
2万
查看次数

导航架构组件 - 对话框片段

是否可以使用带有DialogFragment的新导航架构组件?我是否必须创建自定义导航器?

我很乐意将它们与导航图中的新功能结合使用.

android android-architecture-components android-jetpack android-architecture-navigation

39
推荐指数
4
解决办法
1万
查看次数

导航 Arch 组件是否会造成误报内存泄漏?

我对内存泄漏以及可能导致它们的原因有基本的了解。这就是为什么我不明白我的代码是否有问题或者是误报。由于项目不小,不知道该分享哪一部分代码。但请在评论中告诉我,我会添加所需的代码。

我使用导航拱组件并遵循 MVVM 模式。我后来在项目开发中添加了 LeakCanary 库,当我在屏幕之间导航时,它立即开始向我发出有关保留实例的警告。

当我将片段添加到后堆栈时会出现问题。随着每个添加到返回堆栈的片段,保留实例的计数器增加。当达到阈值 5 LeakCanary 转储堆并提供报告。

但是,如果我单击后退按钮并返回到之前的屏幕,则保留实例的计数器会减少,最终,当返回到第一个屏幕时,所有保留的实例都会消失。

如果我查看堆分析报告,它说作为对CoordinatorLayoutin xml的引用的变量 coordinatorLayout已经泄漏。如果我删除变量及其所有用法并再次运行应用程序,我会看到同样的问题,但现在另一个变量是对 xml 中另一个视图的引用。我试图删除 LeakCanary 报告为泄漏的所有视图及其使用情况。当它说 aTextView只是用来设置文本onViewCreated而不在其他任何地方使用时,它正在泄漏,我开始怀疑我的代码中存在问题。

我分析了片段中的生命周期方法调用,并注意到当我导航到前一个片段的新屏幕时,所有方法直到和包括onDestroyView被调用但没有被调用onDestroy。当我单击返回时onDestroy,会为位于后堆栈顶部的片段调用返回,并且保留实例计数器减少。

我怀疑导航组件在返回堆栈中时保留了片段的实例,而 LeakCanary 将其视为泄漏。

android memory-leaks kotlin leakcanary android-architecture-navigation

34
推荐指数
1
解决办法
9183
查看次数

导航架构组件 - 将参数数据传递给startDestination

我有一个活动A,它启动活动B传递一些意图数据.活动B托管来自新导航架构组件的导航图.我想将该意图数据作为参数传递给startDestination片段如何做到这一点?

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

33
推荐指数
6
解决办法
1万
查看次数

导航架构组件 - 活动

我一直在关注导航架构组件的文档,以了解这个新导航系统的工作原理.

要从一个屏幕转到另一个屏幕,您需要一个实现NavHost接口的组件.

NavHost是一个空视图,当用户浏览您的应用程序时,目的地会被换入和换出.

但是,似乎目前只有Fragments实现 NavHost

Navigation Architecture Component的默认NavHost实现是NavHostFragment.

所以,我的问题是:

  • 即使我有一个非常简单的屏幕可以实现Activity,为了使用这个新的导航系统,Fragment需要托管包含实际视图?

  • 在不久的将来会Activity实现NavHost接口吗?

- 更新 -

根据ianhanniballake的回答,我了解每个活动都包含自己的导航图.但是,如果我想使用导航组件从一个活动转到另一个活动(替换"旧" startActivity呼叫),我可以使用activity destinations.什么是activity destinations我不清楚,因为迁移文档没有详细说明:

然后,可以通过向导航图添加活动目标来链接单独的活动,从而在整个代码库中替换startActivity()的现有用法.

  • 使用ActivityNavigator而不是有什么好处startActivity吗?
  • 使用导航组件时,从活动开始的正确方法是什么?

android android-architecture-navigation

31
推荐指数
3
解决办法
1万
查看次数

是否可以使用Android导航架构组件(Android Jetpack)有条件地设置startDestination?

我使用的导航Android的Jetpack的屏幕之间进行导航.现在我想动态设置startDestination.

我有一个名为MainActivity的Activity和两个Fragments,FragmentA和FragmentB.

var isAllSetUp : Boolean = // It is dynamic and I’m getting this from Preferences.

    If(isAllSetUp)
    {
     // show FragmentA
    }
    else
    {
     //show FragmentB
    }
Run Code Online (Sandbox Code Playgroud)

我想使用Navigation Architecture Component设置上面的流程.目前我使用startDestionation如下所示,但它不符合我的要求.

<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/lrf_navigation"
   app:startDestination="@id/fragmentA">

   <fragment
       android:id="@+id/fragmentA"
       android:name="com.mindinventory.FragmentA"
       android:label="fragment_a"
       tools:layout="@layout/fragment_a" />
</navigation>
Run Code Online (Sandbox Code Playgroud)

是否可以使用Android导航架构组件有条件地设置startDestination?

android android-jetpack android-architecture-navigation

31
推荐指数
3
解决办法
9029
查看次数

如何以编程方式更改导航图的起始目标[Jetpack]

基本上,我有以下导航图:

在此输入图像描述

我希望fragment 2在到达之后将导航图中的起点更改为正确(为了防止fragment 1在按下后退按钮时返回 - 就像启动画面一样).

这是我的代码:

navGraph = navController.getGraph();
navGraph.setStartDestination(R.id.fragment2);
navController.setGraph(navGraph);
Run Code Online (Sandbox Code Playgroud)

但是,显然它不起作用,fragment 1按下后退按钮后又回来了.

我做错了吗?还有其他解决方案吗?

android android-navigation android-jetpack android-architecture-navigation

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