热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Android中Fragment的加载方式与数据通信详解

本文主要介绍了Android中Fragment的加载方式与数据通信的相关知识。具有很好的参考价值。下面跟着小编一起来看下吧

一、加载方式

1. 静态加载

1.1 加载步骤

(1) 创建fragment:创建自定义Fragment类继承自Fragment类,同时将自定义Fragment类与Fragment视图绑定(将layout转换成View)

View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)

inflater用于绑定Fragment的布局文件,同时将该布局转换成View对象并返回;container为Fragment的UI所在的父容器。返回值为Fragment显示的UI,若不显示,则返回null。

inflate(int resource, ViewGroup root, boolean attachToRoot)

resource为Fragment需要加载的布局文件;root为加载Fragment的父ViewGroup,也就是onCreateView传递进来的container;attachToRoot为是否返回父ViewGroup。

(2) 使用fragment:在父视图中引入fragment,静态加载必须指定name属性以及一个唯一标识符,标识符可以为id或者tag


android:name

android:id
android:tag

(3) 监听事件:若在父视图对应的类中设置监听事件,可以直接访问fragment中的子组件;若在Fragment的类中设置,则必须通过inflate()返回的View对象访问Fragment中的子组件(view.findViewById(id))。

1.2 简单范例

MyFragment视图:

<&#63;xml version="1.0" encoding="utf-8"&#63;>

 

MyFragment类:

public class MyFragment extends Fragment {
 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
 //将layout布局转换成View对象
 View view = inflater.inflate(R.layout.myfragment, container, false);
 //必须通过view对象对其子组件进行访问
 TextView textView = (TextView) view.findViewById(R.id.fragment_text);
 textView.setText("这里是fragment");
 //返回Fragment显示UI
 return view;
 }
}

引用fragment的父视图:

<&#63;xml version="1.0" encoding="utf-8"&#63;>

 

父视图对应的类设置事件监听:

public class StaticFragmentActivity extends Activity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_static_fragment);
 //可直接通过findViewById访问
 findViewById(R.id.fragment_text).setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
  Toast.makeText(StaticFragmentActivity.this, "点击了文本", Toast.LENGTH_SHORT).show();
  }
 });
 }
}

2. 动态加载

2.1 加载步骤

(1) 获取事务管理器:对Fragment进行的添加、移除、替换等操作,均为事务。需通过以下代码获取事务管理器,从而对fragment进行动态操作。

FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();

(2) 创建Fragment对象:创建需要加载的fragment,而后通过add或replace等方法实现动态加载。

2.2 简单范例

布局:

<&#63;xml version="1.0" encoding="utf-8"&#63;>

 

Java:

public class DynamicFragmentActivity extends Activity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_dynamic_fragment);
 findViewById(R.id.load).setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
  //获取事务管理器
  FragmentManager fragmentManager = getFragmentManager();
  FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
  //创建fragment,并将其动态加载到id位container的布局中
  MyFragment myFragment = new MyFragment();
  fragmentTransaction.add(R.id.container, myFragment);
  //提交事务
  fragmentTransaction.commit();
  }
 });
 }
}

二、数据通信

3. Activity向Fragment传递数据

3.1 Activity向动态加载的Fragment传递数据

(1)在Activity中获取Fragment对象;

(2)创建Bundle对象并传入数据;

(3)将Bundle对象传递给Fragment对象;

(4)在Fragment中获取Bundle对象并拆包得到数据。

范例:Activity中只有一个id为send的Button,MyFragment中只有一个TextView,这里就不再放布局代码了。

Activity:

public class MainActivity extends Activity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 findViewById(R.id.send).setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
  //创建Fragment对象
  MyFragment myFragment = new MyFragment();
  //创建Bundle对象并传入数据
  Bundle bundle = new Bundle();
  bundle.putString("info", "这里是向Fragment传递的数据");
  myFragment.setArguments(bundle);
  //加载Fragment
  FragmentManager fragmentManager = getFragmentManager();
  FragmentTransaction beginTransaction = fragmentManager.beginTransaction();
  beginTransaction.add(R.id.layout, myFragment, "myfragment");
  beginTransaction.commit();
  }
 });
 }
}

Fragment:

public class MyFragment extends Fragment {
 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
 View view = inflater.inflate(R.layout.my_fragment, container, false);
 TextView tv = (TextView) view.findViewById(R.id.text);
 //获取数据
 String text = getArguments().get("info") + "";
 tv.setText(text);
 return view;
 }
}

3.2 Activity向静态加载的Fragment传递数据

(1)在Fragment中创建作为容器的数据对象,并创建getter和setter;

(2)在Activity中获取FragmentManager;

(3)通过事务管理器的findFragmentById或findFragmentByTag方法,获得fragment对象;

(4)通过获得的fragment对象调用容器的setter方法进行传值。

范例:这里的布局与动态加载的布局唯一不同的就是将send按钮放在了Fragment里面,其它相同。

Fragment:

public class MyFragment extends Fragment {
 private Button btn;
 private String received;//作为容器的对象
 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
 View view = inflater.inflate(R.layout.my_fragment, container, false);
 TextView tv = (TextView) view.findViewById(R.id.text);
 tv.setText("这里是Fragment");
 btn = (Button) view.findViewById(R.id.send);
 btn.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
  Toast.makeText(getActivity(), "成功接收\"" + getReceived() + "\"", Toast.LENGTH_SHORT).show();
  }
 });
 return view;
 }
 public String getReceived() {
 return received;
 }
 public void setReceived(String received) {
 this.received = received;
 }
}

Activity:

public class MainActivity extends Activity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 FragmentManager fragmentManager = getFragmentManager();
 MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.my_fragment);
 myFragment.setReceived("this is a test.");
 }
}

4. Fragment向Activity传递数据

(1)在Fragment中写一个回调接口;

(2)在activity中实现这个回调接口,实现的函数用于传值;

(3)重写Fragment中onAttach,在其中创建一个接口对象,得到传递过来的activity(我的理解是这个接口其实相当于传递过来的activity的一个父类,这一步是用到了多态的特性);

(4)用得到的接口对象进行传值。

Fragment:

public class MyFragment extends Fragment {
 private SendData sendData;
 @Override
 public void onAttach(Activity activity) {
 super.onAttach(activity);
 //获取实现的接口对象
 sendData = (SendData) activity;
 }
 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
 View view = inflater.inflate(R.layout.my_fragment, container, false);
 TextView tv = (TextView) view.findViewById(R.id.text);
 tv.setText("这里是Fragment");
 //通过接口对象传递数据
 sendData.sendMsg("this is a test.");
 return view;
 }
 //定义一个回调接口
 public interface SendData{
 void sendMsg(String str);
 }
}

Activity:

public class MainActivity extends Activity implements MyFragment.SendData{
 private Button btn;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 btn = (Button) findViewById(R.id.send);
 btn.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
  MyFragment myFragment = new MyFragment();
  FragmentManager fragmentManager = getFragmentManager();
  FragmentTransaction beginTransaction = fragmentManager.beginTransaction();
  beginTransaction.add(R.id.layout, myFragment);
  beginTransaction.commit();
  }
 });
 }
 //实现SendData接口,接收数据
 @Override
 public void sendMsg(String str) {
 Toast.makeText(this, "成功接收\"" + str + "\"", Toast.LENGTH_SHORT).show();
 }
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


推荐阅读
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讲述了如何通过代码在Android中更改Recycler视图项的背景颜色。通过在onBindViewHolder方法中设置条件判断,可以实现根据条件改变背景颜色的效果。同时,还介绍了如何修改底部边框颜色以及提供了RecyclerView Fragment layout.xml和项目布局文件的示例代码。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 本文是关于自学Android的笔记,包括查看类的源码的方法,活动注册的必要性以及布局练习的重要性。通过学习本文,读者可以了解到在自学Android过程中的一些关键点和注意事项。 ... [详细]
author-avatar
常奕尧
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有