一、碎片虽然是嵌入在活动中显示的,但是碎片和活动都是各自存在不同的类当中的,并没有什么明显的方式来直接进行通信的。那么如果要在活动中调用碎片里的方法,在碎片里调用活动的方法,一个碎片调用另一碎片的方法,应该怎么实现呢?
1、活动中调用碎片的方法:
为了方便碎片与活动之间进行通信,FragmentManager提供了一个类似于findViewById()的方法,专门从布局文件中获取碎片的实例,代码如下:

Fragment2 fragment2=(Fragment2)getFragmentManager().findFragmentById(R.id.fragment2);

调用 FragmentManager 的 findFragmentById()方法,可以在活动中得到相应碎片的实例,这样就可以调用碎片的方法了。
2、碎片中调用活动的方法:
在每个碎片中都可以通过调用 getActivity()方法来得到和当前碎片相关联
的活动实例,代码如下:

MainActivity activity=(MainActivity)getActivity();

获得活动实例后,就可以在碎片中调用活动的方法。另外当碎片中需要
使用 Context 对象时,也可以使用 getActivity()方法,因为获取到的活动本身就是一个Context对象了。
3、一个碎片中调用另一碎片的方法:
首先,在一个碎片中得到与此碎片相关联的活动实例,然后可以通过这个活动实例去获取另外一个碎片的实例,这样就可以实现一个碎片中与另一碎片之间的通信功能,代码如下:

MainActivity activity=(MainActivity)getActivity();
Fragment2 fragment2=(Fragment2)activity.getFragmentManager().findFragmentById(R.id.fragment2);

二、接下来附上一个简单的例子,该例子实现了一个碎片与另一个碎片通信的功能,实现效果如下:

运行项目后的效果,然后点击左侧列表中的某一项,在右侧会显示你所点击的那一项的文本,如下图所示:

三、首先,新建一个android项目,项目名为Fragment3Test,项目结构图如下:

1、首先,在res目录下的values目录下新建一个array.xml文件,用来绑定左边碎片的列表数据,array.xml代码如下:

<?xml version="1.0" encoding="utf-8"?>
<resources><string-array name="list"><item>Hello World</item><item>Hello Linux</item><item>Hello Java</item><item>Hello Android</item><item>Hello Ios</item><item>Hello Object C</item><item>Hello Swift</item><item>Hello C</item><item>Hello C++</item></string-array>
</resources>

2、在layout目录下新建两个布局文件,分别为fragment1.xml和fragment2.xml,代码分别如下:
fragment1.xml,用来在左边碎片展示一个列表:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><ListView android:id="@+id/listView"android:layout_width="match_parent"android:layout_height="wrap_content"android:entries="@array/list"/></LinearLayout>

fragment2.xml,用来显示右边碎片的内容:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><TextView
        android:id="@+id/textView"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Android World"android:textSize="20sp"/></LinearLayout>

3、在src目录下新建两个类,分别为Fragment1和Fragment2类,都继承于android.app.Fragment类,代码分别如下:
Fragment1.java,左边碎片,其中代码中实现了与右边碎片的通信,即实现点击左边碎片列表的哪个项,右边碎片的文本就为点击的哪个项的文本内容:

package com.example.fragmenttest3;import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;public class Fragment1 extends Fragment {private ListView listView;//声明ListView对象@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View view=inflater.inflate(R.layout.fragment1, container, false);//获得View对象listView=(ListView)view.findViewById(R.id.listView);//获得布局中的ListView控件实例//列表点击时的事件监听器listView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {// TODO Auto-generated method stubMainActivity activity=(MainActivity)getActivity();//获得MainActivity的实例Fragment2 fragment2=(Fragment2)activity.getFragmentManager().findFragmentById(R.id.fragment2);//获得Fragment2碎片对象//当选择列表的项,设置右边碎片中的TextView的内容switch (arg2) {case 0:fragment2.textView.setText(listView.getItemAtPosition(0).toString());break;case 1:fragment2.textView.setText(listView.getItemAtPosition(1).toString());break;case 2:fragment2.textView.setText(listView.getItemAtPosition(2).toString());break;case 3:fragment2.textView.setText(listView.getItemAtPosition(3).toString());break;case 4:fragment2.textView.setText(listView.getItemAtPosition(4).toString());break;case 5:fragment2.textView.setText(listView.getItemAtPosition(5).toString());break;case 6:fragment2.textView.setText(listView.getItemAtPosition(6).toString());break;case 7:fragment2.textView.setText(listView.getItemAtPosition(7).toString());break;case 8:fragment2.textView.setText(listView.getItemAtPosition(8).toString());break;default:break;}}});return view;//返回此视图对象}}

上述代码中的:

MainActivity activity=(MainActivity)getActivity();//获得MainActivity的实例Fragment2 fragment2=(Fragment2)activity.getFragmentManager().findFragmentById(R.id.fragment2);//获得Fragment2碎片对象

这两行代码可以获得Fragment2碎片的实例,便可以调用Fragment2碎片的方法和变量了。
Fragment2.java,右边碎片,代码如下:

package com.example.fragmenttest3;import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;public class Fragment2 extends Fragment {public TextView textView;//声明TextView对象@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// TODO Auto-generated method stubView view=inflater.inflate(R.layout.fragment2, container,false);//获得View对象textView=(TextView)view.findViewById(R.id.textView);//获得右边碎片中的TextView控件实例return view;//返回此视图}}

上述两个类都是加载了相应的碎片,但是我在其中加了一些逻辑。
4、修改默认的activity_main布局文件,用来添加两个碎片,代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent" ><fragment
        android:id="@+id/fragment1"android:name="com.example.fragmenttest3.Fragment1"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1" /><fragment
        android:id="@+id/fragment2"android:name="com.example.fragmenttest3.Fragment2"android:layout_width="0dp"android:layout_height="match_parent"android:layout_weight="1" /></LinearLayout>

5、默认的MainActivity不需要修改,部署此项目便得到上面第二点的效果了。

四、以上内容仅供大家参考学习,谢谢!
源码下载地址:http://download.csdn.net/download/u012561176/9262143

Android学习之碎片与活动之间的通信相关推荐

  1. Android学习之碎片的生命周期

    一.碎片的状态: 1.运行状态:当一个碎片是可见的,并且它所关联的活动正处于运行状态时,该碎片也处于运行状态. 2.暂停状态:当一个活动进入暂停状态时(由于另一个未占满屏幕的活动被添加到了栈顶),与它 ...

  2. android 活动之间传递参数,Android:使用适配器在活动之间传递参数

    希望我能成功地解释我的情况. 我有一个活动(A),基本上是一个表单,用于添加一个新项目,几乎没有文本字段,时间和位置字段. 单击setlocation按钮时,它将调用第二个活动(B),该活动(B)具有 ...

  3. Android使用Intent完成活动之间的通信

    假设我们由一个活动FirstActivity,作为主活动,并且这个活动加载了一个布局,该布局上有一个按键名称为Button1,id为button_1 现在,转到这个活动的源码文件上: public c ...

  4. Android学习之 两个Fragment之间传递信息

    这个简单的实例实现Fragment1向Fragment2传值的功能 首先编写两个fragment的布局文件: Fragment1中使用一个EditText用于输入待发送至Fragment2中的信息,使 ...

  5. Android学习备忘009——Activity之间用Intent传递数据

    前一个Activity Intent intent = new Intent(this,TwoActivity.class); intent.putExtra("name",&qu ...

  6. android 广播观察者,BroadcastReceiver和Activity之间的通信 – android

    我的应用程序中有一个广播接收器,每次用户接到来电时都会被触发.现在,当它发生时,我需要广播接收器来调用特定活动中的特定方法.现在,我尝试将此方法设置为静态,因此可用,但有些东西告诉我这是一个非常糟糕的 ...

  7. Android学习之Socket多个客户端即时通信聊天

    聊天室的原理是这样的,一个客户端与服务器建立通讯成功,即客户端socket连接到服务器的ServerSocket之后,服务器端程序将对应的socket加入到容器中,为每一个socket创建一条线程,服 ...

  8. Android学习笔记(4)——探究碎片

    第四章 手机平板要兼顾--探究碎片 第四章 4.1 碎片是什么 4.2 碎片的使用方式 4.2.1 碎片的简单实用 4.2.2 动态添加碎片 4.2.3 在碎片中模拟回收栈 4.2.4 碎片和活动之间 ...

  9. 安卓学习 之 碎片(四)

    碎片是嵌入在Activity的UI片段,类似于迷你型的活动. 一.碎片的简单用法 建立两个xml文件,这两个文件分别是两个Fragment的布局,与Activity没有什么区别. 新建Fragment ...

最新文章

  1. 老师学python可以干嘛-你都用 Python 来做什么?
  2. 修改otrs notification master邮件通知地址和名称
  3. java中elements_Java中的提供程序elements()方法
  4. FreeNAS 是什么
  5. SQL Server中的事务日志管理(2/9):事务日志架构概述
  6. 超全NetLogo多主体仿真建模(小世界WWW+无标度网络+随机网)内含源码+界面设计+程序分析
  7. 北京科技大学计算机考研
  8. SSLOJ 1322.清兵线
  9. Oracle 重建TEMP表空间
  10. 联发科(MTK)MT6765 核心板 安卓主板
  11. c++头文件iomanip.h中的setw、setprecision、setfill和setbase函数的使用
  12. 前端代码规范——CSS代码规范
  13. 解锁Vue百度地图加载的N种姿势
  14. 真王服务器文件,3方位对比谁是2015级真王 唐斯vs波神各有优势
  15. 火星人学习第一周——虚幻引擎基础应用笔记
  16. C89标准和C99标准C11标准的区别
  17. 基础题库:6 打印ASCII码
  18. JS判断客户端是否已安装ActiveX控件
  19. unity摄像机使用背景颜色的clear mode时,背景剔除不完全,有残影,怎么办?
  20. YII2.0 接口开发步骤

热门文章

  1. Spark SQL整合Hive
  2. ios xcode真机调试获取屏幕截屏
  3. Shutter - 带有众多功能的屏幕截图工具
  4. eclipce 快捷键
  5. mysql select语句执行顺序
  6. javascript单元测试:jasminejs 2.0的烦恼
  7. 【原创】php+mysql下,对网站架构方面的一些认识(以我维护的站点为例)
  8. windows 2003 网络负载平衡设置实战
  9. Linq to SQL 语法记录....并发写事务
  10. TensorFlow2.0(十一)--理解LSTM网络