Android Fragment用法之给Activity创建事件回调

在某些案例中,可能需要Fragment与Activity共享事件。在Fragment内部定义一个回调接口是一个好方法,并且规定由持有它的Activity实现这个回调方法。当Activity通过接口接受回调时,它能在必要时与布局中的其他Fragment共享信息。例如,如果一个音乐播放器的应用程序在一个Activity中有两个Fragment—一个用来显示歌曲列表(Fragment A),另一

大家好,又见面了,我是全栈君。在某些案例中,可能需要Fragment与Activity共享事件。在Fragment内部定义一个回调接口是一个好方法,并且规定由持有它的Activity实现这个回调方法。当Activity通过接口接受回调时,它能在必要时与布局中的其他Fragment共享信息。

例如,如果一个音乐播放器的应用程序在一个Activity中有两个Fragment—一个用来显示歌曲列表(Fragment A),另一个用来显示歌曲信息(Fragment B),然后在列表项目被选中时Fragment A必须告诉Activity,以便它能告诉Fragment B显示对应的歌曲信息。在下面的例子中在Fragment A的内部声明了onMp3ChangedListener接口。

public static class FragmentA extends ListFragment {
    ...
    //持有它的Activity必须实现这个回调方法
    public interface onMp3ChangedListener{
        public void onMp3Changed(int index);//index表示的是歌曲在列表中的序号
    }
    ...
}

然后,持有这个Fragment的Activity要实现onMp3ChangedListener接口,并且要重写onMp3Changed()方法把来自Fragment A的事件通知给Fragment B。要确保持有Fragment的Activity实现这个接口, Fragment A 的onAttach()回调方法(当Fragment被添加到Activity时系统调用这个方法)通过类型转换onAttach()传入的Activity来实例化一个onMp3ChangedListener的实例。

public static class FragmentA extends ListFragment {
    onMp3ChangedListener mListener;
    ...
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (onMp3ChangedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");    }
    ...
}

如果这个Activity没有实现这个接口,那么Fragment会抛出ClassCastException异常。

如果成功,那么mListener成员就会拥有Activity实现的onMp3ChangedListener对象的引用,以便Fragment A能够通过onMp3ChangedListener接口定义的回调方法和Activity共享事件。例如,Fragment A继承了ListFragment,那么用户每次点击列表项时,系统都会调用Fragment中的onListItemClick()方法,然后调用onMp3Changed()方法和Activity共享事件:

public static class FragmentA extends ListFragment {
    OnArticleSelectedListener mListener;
    ...
    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
               mListener.onMp3Changed(position);
    }
    ...
}

传递给onListItemClick()的position参数是被点击项目的行ID,Activity(或其他的Fragment)使用这个ID从歌曲列表中获取对应的歌曲信息。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/121457.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 什么是作用域插槽?插槽与作用域插槽的区别

    什么是作用域插槽?插槽与作用域插槽的区别一、概念//有name的属于具名插槽,没有name属于匿名插槽<app><divslot="a">xxxx</div><div

    2022年8月3日
    5
  • linux中vi编辑器保存文件命令_linux用vi编辑文件

    linux中vi编辑器保存文件命令_linux用vi编辑文件工具:Linux方法:1、首先进入Linux的命令行界面.在目录下创建一个用于测试的文本文件(touchfilename).这里就新建了一个test12文本文件.当然这个名字是可以随便取得.2、用”vitest12″命令进入vi命令行模式(vifilename).如果要想编辑文本文件.必须要转换到插入模式下,也就是按一下键盘上的”i”就可以了.这样就可以编辑文本,删除文本中的内容.按键盘上…

    2022年9月22日
    0
  • Jenkins(4)docker容器内部修改jenkins容器时间「建议收藏」

    Jenkins(4)docker容器内部修改jenkins容器时间「建议收藏」前言用docker搭建的Jenkins环境时间显示和我们本地时间相差8个小时,需修改容器内部的系统时间查看时间查看系统时间date-R进入docker容器内部,查看容器时间dockere

    2022年7月28日
    7
  • Spring Boot第八章-Spring Data JPA

    Spring Boot第八章-Spring Data JPA

    2021年5月16日
    186
  • getElementById怎么调用

    getElementById怎么调用getElementById怎么调用浏览次数:1414次悬赏分:0|解决时间:2011-4-2818:27|提问者:匿名最佳答案首先都有一个Document对象然后你就可以借这个方法来引用网页文件中各个标签的属性了,当然这个被你引用的标签必须具有ID属性;比如,上面那个标签img就具有ID属性,那么我想获取他的图片地址,可以这么用Document.get

    2022年7月15日
    22
  • vue的安装和使用_vue-element

    vue的安装和使用_vue-element前言Vue(读音/vjuː/,类似于view)是一套用于构建前后端分离的框架。刚开始是由国内优秀选手尤雨溪开发出来的,目前是全球“最”流行的前端框架。使用vue开发网页很简单,并且技术生态环境完善

    2022年7月29日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号