我想知道如何使用 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 中实现这一目标?
请注意,共享依赖项不仅限于 ViewModel。
我应该能够在我的范围内共享任何任意类。
android koin android-architecture-navigation navigation-architecture koin-scope
当我尝试在单击时添加目的地时
“新目的地”按钮,从下拉列表中我看不到我的项目中已经存在的任何片段。
当我尝试通过单击下拉菜单中的“创建空白目标”选项来添加空白片段时,我也遇到了这个问题。
我尝试重新启动 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) 有个问题困扰了我很久
在导航组件中,当使用 .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) 将替换片段,在这种情况下如何保留前一个片段中的视图状态?
我有一个活动应用程序,包含三个片段,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
我正在使用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 中使用。
另外,我有三个模块app、data和domain。所以,在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在导航图中使用了这三个类。
但该应用程序仍然崩溃。任何帮助,将不胜感激。
我正在尝试从我的通知中打开一个带有 args 的片段。实际上,就我而言,我的音频播放器与带有通知的前台服务一起运行,现在我想通过在用户单击通知时传递音频 ID 来导航到该特定音频的片段。
android mvvm android-architecture-components android-architecture-navigation navigation-architecture
我在处理多个 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) 我想让宿主 Activity 知道 Fragment 中发生的事情。传统上,我会有一个带有 Fragment 可以调用的回调的接口,但现在我们使用导航架构组件。
有没有办法将主机活动的引用传递给片段,或者我将如何解决“活动和片段之间的通信”情况?
谢谢!
android android-architecture-components androidx navigation-architecture
android ×8
android-architecture-components ×2
android-architecture-navigation ×2
androidx ×2
deeplink ×1
koin ×1
koin-scope ×1
kotlin ×1
mvvm ×1
proguard ×1