Android 布局丢失侦听器中的片段
Android Fragment in Layout Losing Listener
这里有一个有趣的问题。在 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()
}
在我们的例子中,我们创建了一个调用 NavDrawerFragment 的片段,它包含一个带有项目的 RecyclerView 和一个回调接口,该接口挂接到片段的 onAttach(context: Context)
方法中,让 activity 知道单击的项目以及启动下一个所需的任何其他有效负载 activity。一切都按预期工作,新活动使用相同的基本布局,片段侦听器由 activity 实现,直到...按下后退按钮。似乎按下 Activity B 会调用片段上的 onDetach,当 ActivityA 恢复它时,片段实例的 onAttach 方法再也不会被调用。
我是否遗漏了有关片段嵌入到布局中的某些信息,或者这种行为是预期的吗?归根结底,我只需要 ActivityA 的 NavDrawerListener 实现有效 onResume()
.
我刚刚经历了类似的事情,比如奇怪的片段行为。我通过调用
解决了所有奇怪的问题和错误
SupportFragmentManager
片段本身仍然表现得很奇怪,直到我意识到它导入了常规片段。一旦我将其更改为 v4 片段导入,所有奇怪的怪癖都消失了。
这可能无济于事,但希望如此。
好吧,事实证明我完全误解了 variables/values 在 kotlin 的伴随对象中的行为方式。它们本质上绝对是静态的。所以看起来实际发生的是,当 activity B 完成并将 activity A 带回前台时,分离方法将全局伴随对象侦听器值设置为空,因此 activity A 可以无法访问它。
最终答案:使侦听器接口变量成为实例与伴随对象成员的 属性。
再次感谢所有的帮助和见解!
这里有一个有趣的问题。在 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()
}
在我们的例子中,我们创建了一个调用 NavDrawerFragment 的片段,它包含一个带有项目的 RecyclerView 和一个回调接口,该接口挂接到片段的 onAttach(context: Context)
方法中,让 activity 知道单击的项目以及启动下一个所需的任何其他有效负载 activity。一切都按预期工作,新活动使用相同的基本布局,片段侦听器由 activity 实现,直到...按下后退按钮。似乎按下 Activity B 会调用片段上的 onDetach,当 ActivityA 恢复它时,片段实例的 onAttach 方法再也不会被调用。
我是否遗漏了有关片段嵌入到布局中的某些信息,或者这种行为是预期的吗?归根结底,我只需要 ActivityA 的 NavDrawerListener 实现有效 onResume()
.
我刚刚经历了类似的事情,比如奇怪的片段行为。我通过调用
解决了所有奇怪的问题和错误SupportFragmentManager
片段本身仍然表现得很奇怪,直到我意识到它导入了常规片段。一旦我将其更改为 v4 片段导入,所有奇怪的怪癖都消失了。 这可能无济于事,但希望如此。
好吧,事实证明我完全误解了 variables/values 在 kotlin 的伴随对象中的行为方式。它们本质上绝对是静态的。所以看起来实际发生的是,当 activity B 完成并将 activity A 带回前台时,分离方法将全局伴随对象侦听器值设置为空,因此 activity A 可以无法访问它。
最终答案:使侦听器接口变量成为实例与伴随对象成员的 属性。
再次感谢所有的帮助和见解!