作为菜鸟,我发现其他答案有点模糊。 Meda 指出该片段附加到活动中,文档指出它更多的是对它的扩展。我个人觉得说FRAGMENT 实例封装了ACTIVITY 实例更合适。
让我们考虑每个组件的代码;那是INTERFACE、ACTIVITY、FRAGMENT,最后是LAYOUT。
注意: 我使用的是 Kotlin,所以当它转译成 Java 时,有可能会在后台重新连线,尽管这似乎不太可能。
界面
命名CALLBACK 指定它的签名。
interface ConcessionSelection {
fun selectConcession(view : View)
}
注意: 我已将接口移到它自己的类中,因此活动被声明为class ACTIVITY : AppCompatActivity(), INTERFACE 而不是class ACTIVITY : AppCompatActivity(), FRAGMENT.INTERFACE
活动
为CALLBACK 提供逻辑。
class ACTIVITY : AppCompatActivity(), INTERFACE {
...
override fun CALLBACK (view: View) {
Log.i("ACTIVITY:CALLBACK","Activity Callback")
}
...
}
片段
提供一个监听器并在应用程序执行期间附加或分离此类实例。
class FRAGMENT : Fragment() {
private var listener: ACTIVITY? = null
...
override fun onAttach(context: Context) {
super.onAttach(context)
if (context is ACTIVITY) {
listener = context
} else {
throw RuntimeException(context.toString() + " must implement OnFragmentInteractionListener")
}
}
override fun onDetach() {
super.onDetach()
listener = null
}
...
}
布局
指定CALLBACK
<...>
...
<Button
android:id="@+id/button"
android:text="Button"
android:onClick="CALLBACK"/> # Usually highlighted in red by IDE since this is resolved at runtime.
...
</...>
注意: 这是片段的布局文件而不是活动,我不显示活动文件,因为它不相关。
如果您仔细查看了代码,您会发现FRAGMENT 上没有设置CALLBACK,而是设置在ACTIVITY 上。在操作期间,FRAGMENT 将来自onClickListener 的调用委托给它的listener,恰好是ACTIVITY。这让 Android IDE 有点困惑,因为它不够聪明,无法意识到CALLBACK 属于侦听器,即实现INTERFACE 的ACTIVITY,并相应地突出显示相关的 XML。事实上,在片段上设置 CALLBACK 会被忽略,除非采取额外步骤来捕获相关信号,例如我相信ListFragment 这样做是为了重定向到onItemSelected。
模板提供的示例onButtonPressed 似乎只是这样,并没有提供非常有用的实现。也许在 android 网站上有一个教程解释了如何捕获事件并重定向到这个方法。