当前位置: 首页 > news >正文

Activity与Fragment 以及使用接口 fragment向activity床底消息

Fragment是Android honeycomb 3.0新增的概念,Fragment名为碎片不过却和Activity十分相似。

  Fragment是用来描述一些行为或一部分用户界面在一个Activity中,

(1)你可以合并多个fragment在一个单独的activity中建立多个UI面板,

(2)同时重用fragment在多个activity中。

  你可以认为fragment作为一个activity中的一节模块 ,fragment有自己的生命周期,接收自己的输入事件,你可以添加或移除从运行中的activity。

  从中可以看出:一个fragment必须总是嵌入在一个activity中,同时fragment的生命周期 受 activity而影响。当activity 暂停,那么所有在这个activity的fragments将被destroy释放。

 

处理Fragment的生命周期

宿主activity的声明周期直接影响到fragment的生命周期。

 Activity的生命周期:

Fragment生命周期:

  创建一个fragment你必须创建一个Fragment的子类或存在的子类,比如类似下面的代码

public static class AndroidFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) { 
               return inflater.inflate(R.layout.android_fragment, container, false);
    }
}

onAttach()

  当fragment和activity被关联时调用。

onCreate()
当fragment创建时被调用,你应该初始化一些实用的组件,比如在fragment暂停或停止时需要恢复的

onCreateView()
当系统调用fragment在首次绘制用户界面时,如果画一个UI在你的fragment你必须返回一个View当然了你可以返回null代表这个fragment没有UI.

onActivityCreated()

  当activity的onCreate()方法返回时调用

  onResumed()

  在running状态下的可见状态。

  onPaused()

  另一个activity在前景运行,并且享有焦点,但是这个fragment所在的activity仍然可见(前景activity部分遮挡或者是半透明的)。

  onStop()

  fragment不可见。可能是因为宿主activity处于stopped状态,或者fragment被remove掉,然后加在了back stack中。

  一个处于stopped状态的activity还是存活状态的,所有的状态和成员信息会被系统保持。但是,它不再被用户可见,并且如果宿主activity被kill掉,它也会被kill掉。

onDestroyView()

  当fragment的UI被移除的时候调用。

onDetach()

  当fragment和activity去关联时调用。

 

数据存储和恢复

  和Activity类似,可以用Bundle类对象保存fragment的状态,当activity的进程被kill之后,需要重建activity时,可以用于恢复fragment的状态。

  存储时利用onSaveInstanceState()回调函数,恢复时是在 onCreate()onCreateView(), 或者onActivityCreated()里。

 

两者的区别

1.fragment显得更加灵活。可以直接在XML文件中添加<fragment/>,Activity则不能

eg:

<fragment

Android:id="@+id/left_fragment"

Android:name="com.example.fragmenttest.LeftFragment"

…/>

2.可以在一个界面上灵活的替换一部分页面,activity不可以,做不到。

  替换的时候注意要将这个fragment放在返回栈上。

3.fragment和Activity之间的通信:(也就是控件的相互操控)

  fragment控制fragment:得到一个Activity,然后通过这个Activity的getFragmentManager()获得该Fragment的实例。

  fragment控制Activity:这个很简单。每个Fragment都有getActivity()得到一个Activity的实例:

View listView = getActivity().findViewById(R.id.list);PS:在当前activity和fragment已经进行关联的情况下否则返回null。

  Activity控制fragment:activity也可以获得一个fragment的引用,从而调用fragment中的方法:

xxxFragment xxx=getFragmentManager().findFragmentById();

  Activity控制Activity:这个显然是通过Intent活动之间的通信完成。别忘了在被打开的活动中创建Intent和得到Intent一起进行,写个静态的actionStart()。

4.fragment和Activity中控件的加载

  Fragment的载入是通过OnCreateView的时候通过inflater.inflate()加载布局,然后通过修改main.xml,在main.xml上增加注册fragment标签,然后通过android:name来载入你已经通过inflater加载的隐藏布局。

  有几个关键点:fragment是通过inflater加载View然后在main.xml中注册得到的。当然如果你可以在fragment中得到View那就可以通过View.findViewId()来操控fragment上的具体控件。

5.动态加载不同的fragment:

  首先,监听你的按钮。

1.创建待加载fragment的实例

2.得到FragmentManager,在actibity中可以直接调用getFragmentManager()方法获得。

3.调用Manager的BeginTansation()

4.用replace()改变不同的Fragment

5.commit事务。

6.Back Stack

  activity和fragment生命周期最重要的不同之处是它们如何存储在各自的back stack中。

  Activity停止时,是存在一个由系统维护的back stack中,但是当fragment停止(被remove)时,需要程序员显式地调用addToBackStack() ,并且fragment是存在一个由宿主activity掌管的back stack中。

创建事件回调

  些情况下,可能需要fragment和activity共享事件,一个比较好的做法是在fragment里面定义一个回调接口,然后要求宿主activity实现它。

当activity通过这个接口接收到一个回调,它可以同布局中的其他fragment分享这个信息。

  例如,一个新闻显示应用在一个activity中有两个fragment,一个fragment A显示文章题目的列表,一个fragment B显示文章。

  所以当一个文章被选择的时候,fragment A必须通知activity,然后activity通知fragment B,让它显示这篇文章

  这个情况下,在fragment A中声明一个这样的接口OnArticleSelectedListener:

public static class FragmentA extends ListFragment {
...
// Container Activity must implement this interface
  public interface OnArticleSelectedListener {
  public void onArticleSelected(Uri articleUri);
    }
  ...
}

  之后包含这个fragment的activity实现这个OnArticleSelectedListener接口,用覆写的onArticleSelected()方法将fragment A中发生的事通知fragment B。

  为了确保宿主activity实现这个接口,fragment A的onAttach() 方法(这个方法在fragment 被加入到activity中时由系统调用)中通过将传入的activity强制类型转换,实例化一个OnArticleSelectedListener对象:

public static class FragmentA extends ListFragment {
  OnArticleSelectedListener mListener;
...
  @Override
  public void onAttach(Activity activity) {
  super.onAttach(activity);
    try {
    mListener = (OnArticleSelectedListener) activity;
      } catch (ClassCastException e) {
      throw new ClassCastException(activity.toString() + " must implement     OnArticleSelectedListener");
      }
    }
  ...
}

  如果activity没有实现这个接口,fragment将会抛出ClassCastException异常,如果成功了,mListener将会是activity实现OnArticleSelectedListener接口的一个引用,所以通过调用OnArticleSelectedListener接口的方法,fragment A可以和activity共享事件。

  比如,如果fragment A是ListFragment的子类,每一次用户点击一个列表项目,系统调用fragment中的onListItemClick() 方法,在这个方法中可以调用onArticleSelected()方法与activity共享事件。

public static class FragmentA extends ListFragment {
  OnArticleSelectedListener mListener;
  ...
  @Override
  public void onListItemClick(ListView l, View v, int position, long id) {
  // Append the clicked item's row ID with the content provider Uri
    Uri noteUri = ContentUris.withAppendedId(ArticleColumns.CONTENT_URI, id);
  // Send the event and Uri to the host activity
    mListener.onArticleSelected(noteUri);
      }
    ...
  }

相关文章:

  • Android 开发快捷键,idea 开发快捷键
  • Fragment与Activity之间的数据交互
  • tcp/ip协议, http协议,socket通讯demo,socket和http的区别,socket和http优势,socket和http适用范围,流、帧、包、位的区别
  • TCP  UDP  IP PID  VID: Socket ServerSocket,Android开发 Socket通信简单实例
  • oom和anr简单理解
  • 分母有理化
  • run gradle task 进行多应用同时打包 debug和release,以及签名配置。
  • SDK,NDK,AVD,AMD简单理解
  • build.gradle文件介绍,gradle版本对应
  • Android 开发 读取excel文件 jxl.jar包
  • RecyclerView的简单使用在activity和fragment中
  • 好用的dialog工具类,单例实现,普通的Dialog和Textview设置Int型
  • tabLayout实现viewPager+Fragment
  • Android控件绑定代码快速生成工具 ,Android 开发Invalid byte 2 of 2-byte UTF-8 sequence. Textview设置空格
  • Android 开发execel文件在内存和外存传递
  • [deviceone开发]-do_Webview的基本示例
  • HTML-表单
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • python学习笔记-类对象的信息
  • Spring框架之我见(三)——IOC、AOP
  • Yii源码解读-服务定位器(Service Locator)
  • 大快搜索数据爬虫技术实例安装教学篇
  • 面试题:给你个id,去拿到name,多叉树遍历
  • 前端学习笔记之观察者模式
  • 深入浅出Node.js
  • 使用 @font-face
  • 消息队列系列二(IOT中消息队列的应用)
  • 小程序开发中的那些坑
  • 用Visual Studio开发以太坊智能合约
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 回归生活:清理微信公众号
  • ​ArcGIS Pro 如何批量删除字段
  • ​HTTP与HTTPS:网络通信的安全卫士
  • (1)(1.9) MSP (version 4.2)
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (13):Silverlight 2 数据与通信之WebRequest
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (C语言)fgets与fputs函数详解
  • (Git) gitignore基础使用
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (十八)三元表达式和列表解析
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)winform之ListView
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Core引入性能分析引导优化
  • .net 调用php,php 调用.net com组件 --
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...