Activity和Fragment的通信以及Fragment的切换

在上一篇的博客中讲到了,播放器的主界面布局,是由一个activity和一个fragment构成的,activity启动的时候,在其onCreate()方法里就会创建一个fragment的实例对象,并显示在activity中的,这样的一个好处就是处于activity上的控制台(控制上一首/下一首等的按钮)可以不随着fragment的切换而变化,会一直固定在这个播放器的界面上,避免了在好多个activity里都重复写这个控制台.

这一篇博客主要讲的是activity和fragment之间的通信,还有如何用FragmentManager和FragmentTransaction实现Fragment之间的切换.

在开始之前,先新建一个类名为AppConstant,和它的名字一样,这个类专门用来存放需要用到的常量:

public interface AppConstant {

public class PlayerMsg{

public static final int PLAY_MSG = 1; //开始播放

public static final int PAUSE = 2; //暂停播放

public static final int PREVIOUS_MUSIC = 3; //上一首

public static final int NEXT_MUSIC = 4; //下一首

public static final int LOOP_MODE = 5; //循环播放

public static final int RANDOM_MODE = 6; //随机播放

public static final int CHANGE_TO_MY_MUSIC_FRAGMENT=7; //更换fragment消息

public static final int LIST_CLICK = 8; //列表点击

public static final int BACK_TO_MAIN_FRAGMENT=9; //回退到主fragment

public static final int DISMISS_CLICK = 10; //回退到主fragment

public static final int FRAGMENT_RANDOM_PLAY = 11; //小卷毛点歌

public static final int ADD_TO_FAVORITE = 12; //加入我的最爱

public static final int DELETE_FROM_FAVORITE = 13; //删除我的最爱

}

public class NotificationMsg{

public static final String NOTIFICATION_PREVIOUS_MUSIC = "PREVIOUS";

public static final String NOTIFICATION_NEXT_MUSIC = "NEXT";

public static final String NOTIFICATION_PAUSE_MUSIC = "PLAY";

public static final String NOTIFICATION_EXIT = "EXIT";

}

}

在上一篇开发的基础之上,再新建一个Fragment命名为MyMusicFragment,得到了一个fragment_my_music.xml和一个MyMusicFragment.java文件,布局就不多说了,一眼就能看穿的简单布局.

布局的效果大概如下图所示:

其中的fragment_my_music.xml文件布局如下代码:

android:id="@+id/music_list_layout"

android:layout_gravity="center_horizontal"

android:orientation="vertical"

android:layout_height="fill_parent"

android:layout_width="fill_parent"

android:background="@drawable/bg_photo_01">

android:id="@+id/top_layout"

android:background="#00000000"

android:layout_width="match_parent"

android:layout_height="wrap_content">

android:id="@+id/top_layout_right_ImageView"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="@drawable/img_actionitem_back"/>

android:id="@+id/auto_text_view"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:gravity="center"

android:textSize="7pt"

android:textColor="@color/tomato"

android:hint="请输入歌曲名"

android:completionThreshold="1"

android:layout_toRightOf="@id/top_layout_right_ImageView"

android:layout_toEndOf="@id/top_layout_right_ImageView"

android:layout_toLeftOf="@+id/find_music_button"

android:layout_toStartOf="@+id/find_music_button"

android:layout_alignBottom="@+id/find_music_button" />

android:id="@+id/find_music_button"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="@drawable/img_search"

android:layout_centerVertical="true"

android:layout_alignParentRight="true"

android:layout_alignParentEnd="true" />

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_below="@id/top_layout">

android:id="@+id/music_list"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:divider="#ffff99c9"

android:dividerHeight="2dp"

android:drawSelectorOnTop="false"

android:listSelector="@color/cornsilk">

布局文件中的是后面用于快速查询歌曲的一个自动补全TextView,暂时可以不用管,而就是我们用于显示歌曲列表的地方,在下一篇博客中会讲到.

在MyMusicFragment中有一个回退到MainFragment的按钮,注册的方法也是类似的,直接给出源代码:

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

View rootView = inflater.inflate(R.layout.fragment_my_music, container, false);

rootView.findViewById(R.id.top_layout_right_ImageView). //切换至我的音乐Fragment

setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

mListener.onMyMusicFragmentInteraction(AppConstant.PlayerMsg.BACK_TO_MAIN_FRAGMENT);

}

});

return rootView;

}

我们需要实现的Fragment切换是,在MainActivity中将已经显示出来的一个MainFragment实例切换成一个新创建的MyMusicFragment,先要实现的是用户的点击响应时间,由于是在MainFragment上的点击事件,也就是 我的音乐按钮的点击事件,应该在MainFragment上注册相应的监听器,但是Fragment里面又没有像Activity里那样直接findViewById的方法,于是小达就上网查资料,发现Fragment里面会有一个这样的内置函数,

@Override

public View (LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

// Inflate the layout for this fragment

return inflater.inflate(R.layout.fragment_my_music, container, false);

}

当第一次绘制Fragment的UI时系统调用这个方法,必须返回一个View,如果Fragment不提供UI也可以返回null。

对Fragment上的按钮监听器就在这个里面注册,例如如下代码所示:

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

View rootView = inflater.inflate(R.layout.fragment_main, container, false);

rootView.findViewById(R.id.myMusicButton).                                                  //切换至我的音乐Fragment

setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

mListener.onMainFragmentInteraction(AppConstant.PlayerMsg.CHANGE_TO_MY_MUSIC_FRAGMENT);

}

});

return rootView;

}

这里的按钮监听器已经加在按钮上之后,切换到activity中实现Fragment接口的位置,,做出切换fragment的动作...

在这里需要注意的是,activity部分要加一个实现接口的代码.

public class MainActivity extends ActionBarActivity

implements MainFragment.OnFragmentInteractionListener,

MyMusicFragment.OnFragmentInteractionListener{

..........

.....

}

/*

这个方法是activity和fragment通信的一种方法

在MainFragment中调用这个方法,可以在activity中做出相应的反应

*/

public void onMainFragmentInteraction(int msg){

/*

对其中的参数msg做出判断,如果为CHANGE_TO_MY_MUSIC_FRAGMENT

则执行跳转

*/

if(msg == AppConstant.PlayerMsg.CHANGE_TO_MY_MUSIC_FRAGMENT){

/*

在这里并没有直接切换Fragment

而是调用了activity实现MyMusicFragment的那个接口

对后面的开发能带来一点便利之处

*/

onMyMusicFragmentInteraction(AppConstant.PlayerMsg.CHANGE_TO_MY_MUSIC_FRAGMENT);

}

}

public void onMyMusicFragmentInteraction(int msg){

myMusicFragment = new MyMusicFragment();       //创建了MyMusicFragment的实例

FragmentManager fragmentManager = getFragmentManager();   //得到FragmentManager

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); //得到fragmentTransaction

if(msg == AppConstant.PlayerMsg.CHANGE_TO_MY_MUSIC_FRAGMENT){

fragmentTransaction.replace(R.id.fragment_layout, myMusicFragment);

fragmentTransaction.addToBackStack(null);        //这句话是将被替换的MainFragment加入到一个专门存放fragment的栈中,在回退的时候显示上一个Fragment

fragmentTransaction.commit();

}

if(msg == AppConstant.PlayerMsg.BACK_TO_MAIN_FRAGMENT){

fragmentTransaction.replace(R.id.fragment_layout, mainFragment);

fragmentTransaction.addToBackStack(null);

fragmentTransaction.commit();

}

} 到这里为止,就可以实现两个fragment之间的自由切换了,有什么问题的话直接给我留言或者Q我,2319821734.我会尽力回答的,有什么好的建议或者意见也可以向小达提出,我会改正的..233333,下一篇博客将介绍怎么从音乐库中将本地音乐抓出来,放在我们今天写出来的MyMusicFragment中..今天就写这么多啦,各位,886....

android 小卷毛播放器,Android 音乐播放器的开发教程(四)Activity和Fragment的通信以及Fragment的切换 ----- 小达...相关推荐

  1. 微信小程序练手项目-音乐播放器

    微信小程序练手项目-音乐播放器 该项目只适合练手,大佬请绕道 项目展示图: 项目介绍 微信小程序音乐播放器 页面: 音乐推荐.播放器.播放列表 功能: 播放.暂停.上一首.下一首.跳转播放列表.实时进 ...

  2. php文件添加音乐播放器,window_win10系统自带Groove音乐播放器在哪?自带Groove音乐播放器添加音乐等功能的使用教程,   播放器在哪?1 - phpStudy...

    win10系统自带Groove音乐播放器在哪?自带Groove音乐播放器添加音乐等功能的使用教程 播放器在哪? 1.点击桌面的左下端"开始菜单"符号,然后在右上角,找到" ...

  3. 微信小程序 音乐播放控件,监听播放事件, 音乐播放的基本实现

    下面我将会为大家初步讲解利用微信小程序的音乐控件制作音乐播放器,以及会遇到的一些问题,最后会附上源码包喔! 图片以及音乐都必须使用网络链接体 播放器 播放之后闪退,是因为音乐的链接失效了所以 闪退 监 ...

  4. 【毕业设计】28-基于单片机的音乐播放器简易音乐播放器设计(原理图+源代码+仿真工程+答辩PPT+答辩论文)

    typora-root-url: ./ [毕业设计]28-基于单片机的音乐播放器简易音乐播放器设计(原理图+源代码+仿真工程+答辩PPT+答辩论文) 文章目录 typora-root-url: ./ ...

  5. php 在线调用音乐播放器,宅音乐播放器,HTML5网页播放器,带后台管理及API调用,使用thinkphp编写...

    宅音乐播放器 宅音乐播放器,HTML5网页播放器,集成后台管理及API调用,目前正在开发中,敬请关注 技术栈 后端:thinkphp 5.1 前端:layui 数据库:mysql 演示 整合依赖安装包 ...

  6. 微信小程序仿网易云音乐(使用云开发,提供源码)

    微信小程序仿网易云音乐(使用云开发,提供源码)!!!!!!!!!!! 源码: 链接:https://pan.baidu.com/s/1z_ZnRVbT4vjEENimi8yBQQ 提取码:u0o3 一 ...

  7. 【Android】Android开源项目(一)音乐播放器源码汇总

    作为一个有追求的程序员来说,项目源码必须看,但是网上那么多资源是不让你无从下手啊,博主今天为大家推荐五个经典项目吧. 一.android-UniversalMusicPlayer 这个开源项目展示了如 ...

  8. Android开源项目(一)音乐播放器

    作为一个有追求的程序员来说,项目源码必须看,但是网上那么多资源是不让你无从下手啊,博主今天为大家推荐五个经典项目吧. 一.android-UniversalMusicPlayer 这个开源项目展示了如 ...

  9. 【Android工具】高端DLNA音乐播放器Hi-Fi Cast 来自play

    好久没分享安卓手机上好用的应用了,今天分享一个DLNA音乐播放器,这款软件不仅界面高大上,重点是他支持DLNA功能,可以实现随时播放音乐,而不占用设备的存储空间(只占用一个设备的存储空间) 说到DLN ...

最新文章

  1. 复杂系统如何在不停机升级同时保持稳定?你必须考虑以下几个点...
  2. 把项目发到github
  3. boost::geometry::srs::epsg用法的测试程序
  4. Leet Code OJ 101. Symmetric Tree [Difficulty: Easy]
  5. java把控件跑挂了_Java代码动态修改 ConstraintLayout 内控件布局的辅助类
  6. CTFHUB《Web-信息泄露-备份文件下载》网站源码,
  7. 比较HTML元素和Native组件的区别
  8. 写出杨辉三角_认识杨辉三角
  9. 关于”误人子弟!垃圾培训该当何罪“一文
  10. 梯度消失和梯度爆炸_梯度消失和梯度爆炸详解
  11. 5.顺序表和链表的最值,逆置和归并有序表
  12. adb命令查看手机电量_你们要的App电量分析测试来了
  13. 奥卡姆剃刀定律(Occam's Razor, Ockham's Razor)
  14. 海康球机3D定位功能编码实现VC(对前一篇补充改进)
  15. 画画不只是为了艺考,还能成为一门手艺~
  16. python记录鼠标和键盘操作并重复_Python模拟鼠标和键盘操作实现重复性操作
  17. java怎么做rfif上位机软件,最简单的【上位机软件】详解
  18. 美国大学 计算机专业 排名,2019美国大学计算机专业排名
  19. Problem: [Usaco2018 Open]Team Tic Tac Toe
  20. 《黑客秘笈——渗透测试实用指南(第2版)》—第1章1.5节构建渗透测试环境...

热门文章

  1. 【小甲鱼Python】递归:这帮小兔崽子、汉诺塔课后作业
  2. windows防火墙规则添加
  3. 警告关于测试人员的职场生存,千万要避开这5个坑(不看后悔)
  4. F5在K8S环境下的4、7层应用统一发布
  5. 一本建立程序员(其它从业者)世界观、价值观和人生观的书——《黑客与画家》读书笔记
  6. 浅谈Springcloud中的几个主流熔断器
  7. BSD是什么,车辆为什么要装BSD?
  8. 两个坚持是什么_赛客倾诉:没有爱情的婚姻还能坚持多久?3位过来人说出了实话...
  9. 通达+oa+php+文件+乱,通达OA 任意文件上传+文件包含导致RCE
  10. 腾讯云IoT边缘服务,助力6000亩沙漠变良田