布局丢失监听器中的Android片段

时间:2018-02-28 19:36:27

标签: android android-activity kotlin fragment android-lifecycle

这是一个有趣的问题。在Kotlin编写一个应用程序(这真是太棒了),由于客户设计限制,我们必须实现一个自定义导航抽屉(希望我们可以使用app:menu的原生导航视图,但我们不能)。

嵌入式片段

<android.support.design.widget.NavigationView
    android:id="@+id/nav_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:fitsSystemWindows="false">
    <fragment
        android:name="com.redacted.app.nav.NavDrawerFragment"
        android:id="@+id/nav_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</android.support.design.widget.NavigationView>

// our callback
interface NavDrawerListener {
    enum class CurrentState {
        StateOne,
        StateTwo
    }
    fun onStateOneClicked()
    fun onStateTwoClicked()
}

在我们的例子中,我们创建了一个Fragment调用NavDrawerFragment,其中包含一个带有项目的RecyclerView和一个回调接口,该接口在片段的onAttach(context: Context)方法中被连接,让活动知道被点击的项目和任何启动下一个活动所需的额外有效负载。所有工作都按预期工作,新活动使用相同的基本布局,活动实现片段监听器,直到按下后退按钮。似乎按下Activity B会调用片段上的Detach,当ActivityA恢复时,片段实例的onAttach方法永远不会被再次调用。

我是否遗漏了有关嵌入到布局中的片段的内容,或者是否预期会出现这种情况?我在一天结束时所需要的只是ActivityA的NavDrawerListener实现有效onResume()

2 个答案:

答案 0 :(得分:1)

我刚刚经历了类似的事情,就像奇怪的片段行为一样。我通过调用

解决了所有奇怪的问题和错误
SupportFragmentManager

然后片段本身仍然很奇怪,直到我意识到它导入了常规片段。一旦我将其更改为v4片段导入,所有奇怪的怪癖都消失了。 这可能没有用,但希望它能做到。

答案 1 :(得分:1)

好吧事实证明我完全误解了变量/值在kotlin中的伴随对象中的行为。它们绝对是静态的。所以实际上发生的事情是,当活动B完成并将活动A带回前台时,分离方法将全局伴侣对象侦听器值设置为null,因此活动A无法访问它。

最终答案:使侦听器接口变量成为实例与伴随对象成员的属性。

再次感谢所有帮助和见解!