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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • VSCode 断点调试项目「建议收藏」

    VSCode 断点调试项目「建议收藏」1.安装必须程序首页下载VSCode,打开一个项目扩展安装DebuggerforChrome插件用于Chrome调试;点击扩展搜索DebuggerforChrome然后点击安装2.VScode项目配置打开项目界面按F5出现界面选择Chrome添加成功后点击调试,添加配置,自动生成launch.json,添加配置的url为iis配置地址3…

    2022年5月21日
    40
  • java杀死进程_linux杀死所有进程

    java杀死进程_linux杀死所有进程使用jps命令jps的作用是显示当前系统的java进程情况及进程id。使用命令taskkill/f/pid”1952″后此时就杀死了当前的指定的进程

    2022年9月21日
    2
  • laravel 在nginx服务器上除了首页其余都是404的问题

    laravel 在nginx服务器上除了首页其余都是404的问题

    2021年11月7日
    40
  • winscp的root连接ubuntu“拒绝访问”的解决方法

    winscp的root连接ubuntu“拒绝访问”的解决方法问题如上所示。解决:1、修改ssh配置文件:vimetc/ssh/sshd_config在#PermitRootLoginwithout-password此行下新增一行:PermitRootLoginyes保存退出。2、重启sshservicesshrestart3、重新用root账户登陆,输入密码,成功登陆。…

    2025年12月9日
    3
  • 浅析@ResponseBody注解作用和原理

    浅析@ResponseBody注解作用和原理    @ResponseBody这个注解通常使用在控制层(controller)的方法上,其作用是将方法的返回值以特定的格式写入到response的body区域,进而将数据返回给客户端。当方法上面没有写ResponseBody,底层会将方法的返回值封装为ModelAndView对象。    假如是字符串则直接将字符串写到客户端,假如是一个对象,此时会将对象转化为json串然后写到客户…

    2022年5月28日
    49
  • 如何解决Xcode中的SIGABRT错误

    一分钟,您的iOS应用程序可以在Xcode中正常运行,而下一分钟,它由于不可思议的SIGABRT错误而崩溃了。这是怎么回事!?在本教程中,您将学习:如何解决Xcode中的“SignalSIGABRT”错误 如何在Xcode中使用某些调试工具 SIGABRT代表什么,其原因是什么 找到SIGABRT根本原因的3种方法准备好?我们走吧。“线程1:信号SIGABRT”是什么意思? 检查您的Outlets 检查堆栈跟踪 设置异常断点 进一步阅读“线程1:信号SIGABRT”是什..

    2022年4月17日
    55

发表回复

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

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