标签: navigation-architecture

Koin 共享范围为嵌套图的依赖项

我想知道如何使用 Koin 库正确确定依赖范围。

由于 Google 推荐了单一Activity架构,因此AndroidX 导航库已成为通过轻松交换Fragments来促进这一点的关键库。

典型的现代 Android 应用程序在包和/或Gradle模块中具有多个分离的功能。
这些功能模块提供了一个可以在根图中用作嵌套图的图。(见图)

<?xml version="1.0" encoding="utf-8"?>
<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/root_graph"
    app:startDestination="@id/mainFragment">

    <include app:graph="@navigation/nav_graph_feature_a" />
    <include app:graph="@navigation/nav_graph_feature_b" />

    <fragment
        android:id="@+id/mainFragment"
        android:name="com.example.androidx_navigation.MainFragment"
        android:label="MainFragment"
        tools:layout="@layout/fragment_main">
        <action
            android:id="@+id/action_mainFragment_to_featureAFragment1"
            app:destination="@id/nav_graph_feature_a" />
        <action
            android:id="@+id/action_mainFragment_to_featureBFragment1"
            app:destination="@id/nav_graph_feature_b" />
    </fragment>
</navigation>
Run Code Online (Sandbox Code Playgroud)

功能模块的 Koin 范围

应遵守以下规则:

  • 每层代表一个范围。
  • 内层可以注入外层中定义的任何内容。
  • 没有重叠的层不应该能够注入彼此的依赖关系。
  • 离开一个层应该处理它的依赖项。

更具体地说:

  • FeatureA 可以注入 Activity 和 App 依赖项,但不能注入 FeatureB 依赖项
  • FeatureB 可以注入 Activity 和 App 依赖项,但不能注入 FeatureA 依赖项

如何在 Koin 中实现这一目标?

请注意,共享依赖项不仅限于 ViewModel。
我应该能够在我的范围内共享任何任意类。

android koin android-architecture-navigation navigation-architecture koin-scope

7
推荐指数
1
解决办法
496
查看次数

Android 导航组件:从 nav_graph.xml 添加目的地时,在下拉列表中看不到片段

当我尝试在单击时添加目的地时 在此处输入图片说明 “新目的地”按钮,从下拉列表中我看不到我的项目中已经存在的任何片段。

当我尝试通过单击下拉菜单中的“创建空白目标”选项来添加空白片段时,我也遇到了这个问题。

我尝试重新启动 IDE,此Android 导航组件不显示片段,但并没有解决我的问题。

导航依赖:实现“androidx.navigation:navigation-fragment:1.0.0-rc02”

我的项目已经迁移到 AndroidX。

我错过了什么吗?任何帮助,将不胜感激。

Gradle依赖:

def nav_version = "1.0.0-rc02"

implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0-alpha02'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'com.google.android.material:material:1.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.2-alpha02'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0-alpha02'
implementation 'androidx.cardview:cardview:1.0.0'

implementation "android.arch.navigation:navigation-fragment:$nav_version"
Run Code Online (Sandbox Code Playgroud)

android android-jetpack androidx navigation-architecture

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

Android:导航组件中操作ID和片段ID之间的区别

有个问题困扰了我很久

在导航组件中,当使用 .navigate(int resId) 时,传递动作 id 与片段 id 有何不同?

例子:

<fragment android:id="@+id/loginFragment"
          android:name="com.example.myapp.ui.main.LoginFragment"
          android:label="@string/login"
          tools:layout="@layout/fragment_login" >

    <action
        android:id="@+id/action_login_to_emailLoginFragment"
        app:destination="@id/emailLoginFragment"
        app:popEnterAnim="@anim/slide_in_right"
        app:popExitAnim="@anim/slide_out_right"
        app:popUpTo="@+id/emailLoginFragment"
        app:popUpToInclusive="true"/>

</fragment>

<fragment android:id="@+id/emailLoginFragment"
          android:name="com.example.myapp.ui.main.EmailLoginFragment"
          android:label="EmailLoginFragment"
          tools:layout="@layout/fragment_login_email" />
Run Code Online (Sandbox Code Playgroud)

在上面的场景中,如果

1) 使用 .navigate(R.id.action_login_to_emailLoginFragment);

2) 使用 .navigate(R.id.emailLoginFragment);

我还有一个查询,我知道 .navigate(int resId) 将替换片段,在这种情况下如何保留前一个片段中的视图状态?

android navigation-architecture

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

使用 NavDeepLinkBuilder 构建 Fragment backstack

我有一个活动应用程序,包含三个片段,A、B、C。在正常的应用程序流程中,片段按顺序打开:A->B->CI 有一个前台服务,并带有通知,单击时应打开片段C. 我使用导航架构组件,并将目的地作为深层链接添加到通知中:

NotificationCompat.Builder(context, NOTIFICATION_CHANNEL)
    ....
    .setContentIntent(NavDeepLinkBuilder(context)
        .setGraph(R.navigation.main_navigation)
        .setDestination(R.id.fragmentC)
        .setArguments(bundle)
        .createPendingIntent())
    .build()
Run Code Online (Sandbox Code Playgroud)

未构建片段后台堆栈。当我从片段 C 导航回来时,我立即到达片段 A,而不是 B。根据导航原则, backstack 应该是自然的,但我似乎无法实现。我在这里缺少什么?谢谢你。

android android-fragments fragment-backstack deeplink navigation-architecture

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

将 SafeArgs 与 Proguard 和导航架构组件一起使用时出现 ClassNotFoundException?

我正在使用SafeArgs插件,Navigation Architecture Component但应用程序崩溃了。

Caused by: java.lang.ClassNotFoundException: Didn't find class "com.package.domain.models.Model"
Run Code Online (Sandbox Code Playgroud)

minifyEnabled true在 Gradle 中使用。

另外,我有三个模块appdatadomain。所以,在proguard-rules我添加的所有三个文件中

-keepnames class com.package.domain.models.Model1
-keepnames class com.package.domain.types.ImageType
-keepnames class com.package.domain.models.Model
Run Code Online (Sandbox Code Playgroud)

argType在导航图中使用了这三个类。

但该应用程序仍然崩溃。任何帮助,将不胜感激。

android proguard navigation-architecture

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

如何使用可能的待处理意图从服务导航到导航片段?

我正在尝试从我的通知中打开一个带有 args 的片段。实际上,就我而言,我的音频播放器与带有通知的前台服务一起运行,现在我想通过在用户单击通知时传递音频 ID 来导航到该特定音频的片段。

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

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

如何处理多个 NavHosts/NavControllers?

我在处理多个 NavHost 时遇到问题。这个问题与这里提出的问题非常相似。我认为这个问题的解决方案对我也有帮助,但它是 2017 年的帖子,仍然没有答案。Android 开发人员文档没有帮助,通过网络搜索绝对没有任何可能有帮助的内容。

所以基本上我有一个活动和两个片段。我们称它们为 FruitsActivity、FruitListFragment、FruitDetailFragment,其中 FruitsActivity 没有相关代码,其 xml 布局由一个<fragment>标签组成,作为NavHost,如下所示:

<fragment
            android:id="@+id/fragmentContainer"
            android:name="androidx.navigation.fragment.NavHostFragment"
            app:navGraph="@navigation/fruits_nav_graph"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
Run Code Online (Sandbox Code Playgroud)

FruitListFragment 是我的 NavGraph 的 startDestination,它处理来自服务器的水果列表。FruitDetailFragment 显示有关在 FruitListFragment 显示的列表中选择的 Fruit 的详细信息。

到目前为止,我们有 Activity -> ListFragment -> DetailFragment。

现在我需要再添加一个 Fragment,称为 GalleryFragment。这是一个简单的片段,显示所选水果的许多图片,并在单击按钮时由 FruitDetailFragment 调用。

这里的问题是:在纵向模式下,我只是使用findNavController().navigate(...)并按照自己的意愿浏览片段。但是当我在横向模式下使用平板电脑时,我正在使用主详细信息流在同一屏幕上显示列表和详细信息。还有就是它是如何工作的例子在这里,我想GalleryFragment更换FruitDetailFragment,水果列表共享屏幕,但到目前为止,我只能设法使其代替“主导航”流动,占据整个screen 并将 FruitListFragment 发送到 Back Stack。

我已经尝试过使用findNavController()方法,但是无论我从哪里调用它,我都只能NavController始终获得相同的结果,并且它始终以相同的线性方式导航。我试图实现我自己的 NavHost,但我得到并错误“找不到 androidx.navigation.NavHost 的类文件”。

这是我的 FruitsActivity 的 xml:

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

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <fragment
            android:id="@+id/fragmentContainer"
            android:name="androidx.navigation.fragment.NavHostFragment"
            app:navGraph="@navigation/listing_nav_graph" …
Run Code Online (Sandbox Code Playgroud)

android android-fragments kotlin navigation-architecture

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

使用导航架构组件时,Activity 和 Fragment 之间的通信

我想让宿主 Activity 知道 Fragment 中发生的事情。传统上,我会有一个带有 Fragment 可以调用的回调的接口,但现在我们使用导航架构组件。

有没有办法将主机活动的引用传递给片段,或者我将如何解决“活动和片段之间的通信”情况?

谢谢!

android android-architecture-components androidx navigation-architecture

2
推荐指数
1
解决办法
1442
查看次数