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
我正在使用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
当我尝试从一个片段导航到另一个片段时,我遇到了新的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 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
是否可以使用带有DialogFragment的新导航架构组件?我是否必须创建自定义导航器?
我很乐意将它们与导航图中的新功能结合使用.
android android-architecture-components android-jetpack android-architecture-navigation
我对内存泄漏以及可能导致它们的原因有基本的了解。这就是为什么我不明白我的代码是否有问题或者是误报。由于项目不小,不知道该分享哪一部分代码。但请在评论中告诉我,我会添加所需的代码。
我使用导航拱组件并遵循 MVVM 模式。我后来在项目开发中添加了 LeakCanary 库,当我在屏幕之间导航时,它立即开始向我发出有关保留实例的警告。
当我将片段添加到后堆栈时会出现问题。随着每个添加到返回堆栈的片段,保留实例的计数器增加。当达到阈值 5 LeakCanary 转储堆并提供报告。
但是,如果我单击后退按钮并返回到之前的屏幕,则保留实例的计数器会减少,最终,当返回到第一个屏幕时,所有保留的实例都会消失。
如果我查看堆分析报告,它说作为对CoordinatorLayoutin xml的引用的变量 coordinatorLayout已经泄漏。如果我删除变量及其所有用法并再次运行应用程序,我会看到同样的问题,但现在另一个变量是对 xml 中另一个视图的引用。我试图删除 LeakCanary 报告为泄漏的所有视图及其使用情况。当它说 aTextView只是用来设置文本onViewCreated而不在其他任何地方使用时,它正在泄漏,我开始怀疑我的代码中存在问题。
我分析了片段中的生命周期方法调用,并注意到当我导航到前一个片段的新屏幕时,所有方法直到和包括onDestroyView被调用但没有被调用onDestroy。当我单击返回时onDestroy,会为位于后堆栈顶部的片段调用返回,并且保留实例计数器减少。
我怀疑导航组件在返回堆栈中时保留了片段的实例,而 LeakCanary 将其视为泄漏。
android memory-leaks kotlin leakcanary android-architecture-navigation
我有一个活动A,它启动活动B传递一些意图数据.活动B托管来自新导航架构组件的导航图.我想将该意图数据作为参数传递给startDestination片段如何做到这一点?
navigation android android-architecture-components android-architecture-navigation
我一直在关注导航架构组件的文档,以了解这个新导航系统的工作原理.
要从一个屏幕转到另一个屏幕,您需要一个实现NavHost接口的组件.
NavHost是一个空视图,当用户浏览您的应用程序时,目的地会被换入和换出.
但是,似乎目前只有Fragments实现 NavHost
Navigation Architecture Component的默认NavHost实现是NavHostFragment.
所以,我的问题是:
即使我有一个非常简单的屏幕可以实现Activity,为了使用这个新的导航系统,Fragment需要托管包含实际视图?
在不久的将来会Activity实现NavHost接口吗?
- 更新 -
根据ianhanniballake的回答,我了解每个活动都包含自己的导航图.但是,如果我想使用导航组件从一个活动转到另一个活动(替换"旧" startActivity呼叫),我可以使用activity destinations.什么是activity destinations我不清楚,因为迁移的文档没有详细说明:
然后,可以通过向导航图添加活动目标来链接单独的活动,从而在整个代码库中替换startActivity()的现有用法.
ActivityNavigator而不是有什么好处startActivity吗?我使用的导航从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?
基本上,我有以下导航图:
我希望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
android ×10
android-architecture-navigation ×10
android-architecture-components ×4
kotlin ×1
leakcanary ×1
memory-leaks ×1
navigation ×1