Android - Fragment (三)不同Fragment之间的通信
在Fragment的java文件中,可以使用getActivity()来获得调用它的activity,
然后再找到另一个Fragment,进行通信
getActivity().getFragmentManager().findFragmentById(R.id.fragment_list);
但这样做耦合度太高,不方便后续的修改操作
Fragment与其附着的Activity之间的通信,都应该由Activity来完成
不能是多个Fragment之间直接通信
Fragment与其附着的Activity之间通信最佳方式:
1. 在发起事件的Fragment中定义一个接口,接口中声明你的方法
2. 在onAttach方法中要求Activity实现该接口
3. 在Activity中实现该方法
例如一个activity中布置了2个Fragment,它们之间的通信要依靠activity来完成
代码: ListStoreActivity.java NewItemFragment.java ListStoreFragment.java
布局文件为: liststore.xml new_item_fragment.xml
准备布局文件:
liststore.xml 用LinearLayout中放置了2个fragment,分别指向2个Fragment文件
<fragment android:id="@+id/fragment_new" android:name="com.rust.liststore.NewItemFragment" android:layout_width="match_parent" android:layout_height="wrap_content" /> <fragment android:id="@+id/fragment_listview" android:name="com.rust.liststore.ListStoreFragment" android:layout_width="match_parent" android:layout_height="wrap_content" />
new_item_fragment.xml 中并排放置一个EditText和一个按钮
<EditText android:id="@+id/edittx_new" android:layout_width="0dp" android:layout_weight="4" android:layout_height="wrap_content" android:hint="@string/hint_new" /> <Button android:id="@+id/btn_add_new_item" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:text="@string/hint_add_new_item" />
ListStoreFragment.java
public class ListStoreFragment extends ListFragment{ /// 继承自ListFragment,已经封装好了listview /// 不需要自己写ListView了 }
NewItemFragment.java 主要代码如下
/** * 声明一个接口,定义向activity传递的方法 * 绑定的activity必须实现这个方法 */ public interface OnNewItemAddedListener { public void newItemAdded(String content); } private OnNewItemAddedListener onNewItemAddedListener; private Button btnAddItem; /*复写onAttach方法*/ @Override public void onAttach(Activity activity) { super.onAttach(activity); try { onNewItemAddedListener = (OnNewItemAddedListener) activity; } catch (ClassCastException e){ throw new ClassCastException(activity.toString() + "must implement OnNewItemAddedListener"); } }
ListStoreActivity.java
加载主视图setContentView(R.layout.liststore);
两个Fragment通过 ListStoreActivity.java 来通信
在onCreate方法中获取ListStoreFragment的实例;并且复写newItemAdded方法,在里面加上业务逻辑
public class ListStoreActivity extends Activity implements OnNewItemAddedListener{ private ArrayList<String> data; private ArrayAdapter<String> adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.liststore); data = new ArrayList<String>(); // 把data装入adapter中 adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data); // ListFragment并不需要再定义一个listview ListStoreFragment listStoreFragment = (ListStoreFragment) getFragmentManager().findFragmentById(R.id.fragment_listview); listStoreFragment.setListAdapter(adapter); } @Override public void newItemAdded(String content) { // 复写接口中的方法,业务代码在这里实现 if(!content.equals("")) { data.add(content); adapter.notifyDataSetChanged(); } } }
至此,通信搭建完成
Android - Fragment (三)不同Fragment之间的通信的更多相关文章
- Android中BroadCast与Activity之间的通信
在看本文之前,假设你对于Android的广播机制不是非常了解.建议先行阅读我转载的一篇博文:图解 Android 广播机制. 因为本案例比較简单,故直接在此贴出代码,不做过多的阐述. 先上效果截图: ...
- Android中两个Activity之间简单通信
在Android中,一个界面被称为一个activity,在两个界面之间通信,采用的是使用一个中间传话者(即Intent类)的模式,而不是直接通信. 下面演示如何实现两个activity之间的通信. 信 ...
- Java学习笔记46(多线程三:线程之间的通信)
多个线程在处理同一个资源,但是线程的任务却不相同,通过一定的手段使各个线程能有效地利用资源, 这种手段即:等待唤醒机制,又称作线程之间的通信 涉及到的方法:wait(),notify() 示例: 两个 ...
- Android中Service和Activity之间的通信
启动Service并传递数据进去: Android中通过Intent来启动服务会传递一个Intent过去. 可以在Intent中通过putExtra()携带数据 Intent startIntent ...
- Android系列之Fragment(三)----Fragment和Activity之间的通信(含接口回调)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- Android中使用开源框架EventBus3.0实现Fragment之间的通信交互
1.概述 在之前的博文中简单介绍过如何实现fragment之间的信息交互:<Android中Fragment与Activity之间的交互(两种实现方式)>,今天继续给大家介绍一种可以实现此 ...
- [转][译][Android基础]Android Fragment之间的通信
2014-2-14 本篇文章翻译自Android官方的培训教程,我也是初学者,觉得官方的Training才是最好的学习材料,所以边学边翻译,有翻译不好的地方,请大家指正. 如果我们在开发过程中为了重用 ...
- Android使用Fragment来实现ViewPager的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
以下内容为原创,转载请注明:http://www.cnblogs.com/tiantianbyconan/p/3364728.html 我前两天写过一篇博客<Android使用Fragment来 ...
- Android使用Fragment来实现TabHost的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
以下内容为原创,转载请注明:http://www.cnblogs.com/tiantianbyconan/p/3360938.html 如新浪微博下面的标签切换功能,我以前也写过一篇博文(http:/ ...
随机推荐
- APUE-文件和目录(三)函数chown 和lchown
下面的几个chown函数可用于更改文件的用户ID和组ID.如果两个参数owner或group中的任意一个是-1,则对应的ID不变. #include<unistd.h> int chown ...
- 如何用VS进行程序调试
VS是一个强大的IDE,如果你现在只会简单地用它查看一下执行效果,那就太大材小用了. 1. CRT函数报错 首先来说说最常见的一个编译错误.微信里常常收到这个错误的截图提问. CRT(C Runtim ...
- 踩一踩微信小程序开发的坑---tabBar
最近忙于开发视频直播的项目,小程序学习也放置了两三个星期了,web开发者工具更新到新版,发现上个版本做的demo不显示了
- Java8部分新特性的学习
Java8中的新特性 一.Lambda表达式 Lambda表达式可以理解为一种可传递的匿名函数:它没有名称,但又参数列表.函数主体.返回类型,可能还有一个可以抛出的异常列表. 匿名:和匿名类类似的,它 ...
- javascript中event.clientX和event.clientY用法的注意事项
今天做项目用到了event.clientX和event.clientY,给元素定位,用定位的时候,让top和left等于事件元素的的坐标 <!DOCTYPE html> <html& ...
- Web设计思想——渐进增强
最近在拜读一本Web体验相关的书<渐进增强--跨平台用户体验设计 >,阅读后做些总结,消化一下书中的精髓. 在阅读本文前,可以先思考下面几个问题. 1. 浏览网页的目的是什么? 2. 浏览 ...
- SQL Server数据类型有哪些
一. 整数数据类型 整数数据类型是最常用的数据类型之一. 1.INT (INTEGER) INT (或INTEGER)数据类型存储从-2的31次方 (-2 ,147 ,483 ,648) 到2的31次 ...
- Linux文件锁定保护命令chattr介绍
chattr命令的用法:chattr [ -RV ] [ -v version ] [ mode ] files- 最关键的是在[mode]部分,[mode]部分是由+-=和[ASacDdIijsTt ...
- Microsoft Excel 自动取数据库数据
1.下载安装mysql-connector-odbc-5.1.5-win32.msi 2.打开控制面板.搜索数据 3.点击添加→MySQL ODBC 5.1 Driver→完成 4.填写名称.IP地址 ...
- Android 设计模式实战之关于封装计费代码库的策略模式详谈
写在之前 这周生活上出现了很多的不如意,从周一开始就觉得哪里出现了问题,然后就是各种烦躁的情绪,后来事情还真是如预感的那样发生了,很是心痛,但也无可奈何,希望大家都好好珍惜自己身边的人:友人,亲人,家 ...