我最近决定仔细研究一下Google发布的新Android架构组件,特别是将他们的ViewModel生命周期感知类用于MVVM架构和LiveData.
只要我处理单个活动或单个碎片,一切都很好.
但是,我找不到一个很好的解决方案来处理Activity切换.比如说,为了一个简短的例子,活动A有一个按钮来启动活动B.
startActivity()在哪里处理?
遵循MVVM模式,clickListener的逻辑应该在ViewModel中.但是,我们希望避免在那里引用Activity.因此,将上下文传递给ViewModel不是一种选择.
我缩小了几个似乎"没问题"的选项,但却找不到任何正确的答案"这里是怎么做的".
选项1:在ViewModel中有一个枚举,其值映射到可能的路由(ACTIVITY_B,ACTIVITY_C).将此与LiveData结合使用.活动将观察此LiveData,并且当ViewModel决定应该启动ACTIVITY_C时,它只是postValue(ACTIVITY_C).然后,Activity可以正常调用startActivity().
选项2:常规接口模式.与选项1的原理相同,但Activity将实现接口.虽然我觉得与此有点联系.
选项3:消息选项,例如Otto或类似的.ViewModel发送一个Broadcast,Activity选择它并启动它所拥有的内容.此解决方案的唯一问题是,默认情况下,您应该将该广播的注册/取消注册放在ViewModel中.所以没有帮助.
选项4:拥有一个大的路由类,在某个地方,作为单例或类似的,可以被调用以将相关路由分派给任何活动.最终通过界面?所以每个活动(或BaseActivity)都会实现
IRouting { void requestLaunchActivity(ACTIVITY_B); }
Run Code Online (Sandbox Code Playgroud)
当你的应用程序开始有很多片段/活动时,这个方法让我有点担心(因为路由类会变得很大)
就是这样了.那是我的问题.你们是怎么处理这个的?你选择了我没想过的选择吗?您认为最相关的选项是什么?为什么?推荐的Google方法是什么?
PS:没有把我带到任何地方的链接1 - Android ViewModel调用Activity方法 2 - 如何从普通的非活动java类启动活动?
为了更多地了解 Kotlin 并尝试使用它,我正在开发一个示例 Android 应用程序,我可以在其中尝试不同的东西。
但是,即使在该主题上搜索了一段时间后,我也无法为以下问题找到正确的答案:
让我们在 View 类上声明一个(虚拟)扩展函数:
fun View.isViewVisibility(v: Int): Boolean = visibility == v
Run Code Online (Sandbox Code Playgroud)
现在我怎样才能从其他地方引用这个函数以便以后调用 invoke() 呢?
val f: (Int) -> Boolean = View::isViewVisibility
Run Code Online (Sandbox Code Playgroud)
目前给我:
错误:(57, 35) 类型不匹配:推断类型为 KFunction2 但 (Int) -> Boolean was expectedError:(57, 41) 'isViewVisibility' 同时是成员和扩展。不允许引用此类元素
有什么解决方法吗?谢谢 !