Fragment

官网文档:https://developer.android.google.cn/guide/components/fragments

什么是Fragment

在手机上,Activity作为用户和应用交互的界面。如果界面上的View较多较复杂时,Activity会较复杂。Fragment提供了一种解决方案,把view放到几个Fragment中,然后再由这些Fragment拼成一个完整的Activity。

如果多个界面中有相同的部分,可以将重复部分放在fragment中,然后在多个activity中使用该fragment,达到风格统一,代码重用的目的。

Fragment的应用场景:

Fragment的使用

静态添加Fragment

1.      准备Fragment使用的layout文件

2.      新建Fragment类,继承自Fragment

注意:需要重写onCreateView方法;  推荐使用support-v4包中的Fragment类。

public class LeftFragment extends Fragment {

public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

View view=inflater.inflate(R.layout.left_fragment,container,false);

return view;

}

}

这两步完成了一个Fragment,其与Activity非常类似,同样是写好对应的layout,然后在生命周期方法中加载layout。

3.      将该Fragment作为一个普通的控件添加到Activity对应的layout中

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools">

<fragment

     android:id="@+id/left_fragment"

        android:name="com.ncst.coursecode.LeftFragment"

android:layout_width="wrap_content"

android:layout_height="match_parent"/>

</LinearLayout>

注意:必须显式指明id和name属性。name属性即为碎片的类名。

另外,包含碎片的Activity需要继承自FragmentActivity。而我们默认使用的AppCompatActivity正是继承自FragmentActivity。

动态添加Fragment

1,2步骤与上面相同(即准备一个Fragment)。

3.      在Activity对应的layout文件中预留fragment将要放置的容器。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools">

     <FrameLayout

        android:id="@+id/fragment_container"

android:layout_width=" match_parent "

android:layout_height="match_parent"/>

</LinearLayout>

4.      在Acitivity中动态添加Fragment

Fragment fragment=new RightFragment();

FragmentManager manager=getSupportFragmentManager();

FragmentTransaction transaction=manager.beginTransaction();

transaction.add(R.id. fragment_container,fragment);

transaction.commit();

另外两个方法:replace(R.id. fragment_container,fragment);移除容器中已有的所有fragment,并添加本fragement。remove(R.id. fragment_container,fragment);移除容器中的该fragment。

注意:在XML中静态添加的fragment不能通过上述两个方法移除。

addToBackStack()将事务添加到返回栈,该返回栈由Activity管理,以便用户能够通过按返回按钮撤消事务并回退到上一片段。

Fragment与activity进行通信

在活动中获取碎片实例:

getFragmentManager().findFragmentById(R.id.right_fragment);

在碎片中获取和当前碎片相关联的活动实例:

getActivity();

在一个碎片中获取和当前碎片相关联的活动中的另外一个碎片:

getActivity().getFragmentManager().findFragmentById(R.id.left_fragment);

Fragment生命周期

片段必须始终嵌入在 Activity 中,其生命周期直接受宿主 Activity 生命周期的影响。例如,当 Activity 暂停时,其中的所有片段也会暂停;当 Activity 被销毁时,所有片段也会被销毁。

Fragment例子(手机和平板显示不同界面,复用相同的Fragment)

Fragment应用的几个例子

Fragment实现底部导航(类似微信界面)

图片:

分析:页面分为两部分:底部(RadioGroup),上面部分(放置Fragment)

  1. 准备两个Fragment(ChatFragment,MomentFragment)
  2. 编写Activity对应的layout(activity_wechat)
  3. 在Activity中动态将Fragment添加到ViewGroup中。(WechatActivity)
  4. 给RadioGroup添加事件监听,切换Fragment。

ViewPager实现左右滑动界面

ViewPager功能:通过手势滑动可以完成View的切换,一般是用来做APP 的引导页或者实现图片轮播, ViewPager在:android.support.v4.view.ViewPager。

ViewPager就是一个简单的页面切换组件,我们可以往里面填充多个View,然后我们可以左右滑动,从而切换不同的View,和前面学的ListView,RecyclerView一样,我们也需要一个Adapter (适配器)将我们的View填充到ViewPager,ViewPager有一个特定的Adapter—— PagerAdapter!另外,Google官方是建议我们使用Fragment来填充ViewPager的,这样可以更加方便的生成每个Page,以及管理每个Page的生命周期!给我们提供了两个Fragment 专用的Adapter:FragmentPageAdapter和FragmentStatePagerAdapter 。

使用PagerAdapter

  1. 必须重写的四个方法:

instantiateItem(ViewGroup, int):向父布局添加View

destroyItem(ViewGroup, int, Object):移除一个给定位置的View。

getCount():获得viewpager中有多少个view

isViewFromObject(View, Object):一般的实现:return view == object;

一个典型的PagerAdapter类:

public class MyPagerAdapter extends PagerAdapter {

List<View> viewList;

public MyPagerAdapter(List<View> viewList) {

this.viewList = viewList;

}

public int getCount() {

return viewList.size();

}

public boolean isViewFromObject(View view, Object o) {

return view==o;

}

public Object instantiateItem(ViewGroup container, int position) {

container.addView(viewList.get(position));

return viewList.get(position);

}

public void destroyItem(ViewGroup container, int position, Object object) {

container.removeView(viewList.get(position));

}

}

  1. 定义Activity的Layout文件,其中包含ViewPager

<android.support.v4.view.ViewPager

android:id="@+id/view_pager"

android:layout_width="match_parent"

android:layout_height="match_parent">

</android.support.v4.view.ViewPager>

  1. 在Activity中设置ViewPager的Adapter

另外,PagerTabStrip 作为ViewPager的交互指针。只需在XML文档中作为ViewPager的子项即可。并且在PagerAdapter需要重写getPageTitle()方法,用于获取指定页面的标题。

PagerTitleStrip 与PagerTabStrip 类似,区别是不能交互。

<android.support.v4.view.ViewPager

android:id="@+id/view_pager"

android:layout_width="match_parent"

android:layout_height="match_parent">

<android.support.v4.view.PagerTabStrip

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_gravity="top" />

</android.support.v4.view.ViewPager>

官方文档:https://developer.android.google.cn/reference/android/support/v4/view/PagerAdapter

使用FragmentPagerAdapter

是PagerAdapter的实现,每个页面是一个Fragment。

This version of the pager is best for use when there are a handful of typically more static fragments to be paged through, such as a set of tabs. The fragment of each page the user visits will be kept in memory, though its view hierarchy may be destroyed when not visible. This can result in using a significant amount of memory since fragment instances can hold on to an arbitrary amount of state. For larger sets of pages, consider FragmentStatePagerAdapter.

FragmentPagerAdapter适合少量固定数量的页面情况。页面多且不固定时会耗费内存,这时应考虑使用FragmentStatePagerAdapter。

实现FragmentPagerAdapter时只需重写:getItem(int) getCount()

class MyAdapter extends FragmentPagerAdapter {

public MyAdapter(FragmentManager fm) {

super(fm);

}

public Fragment getItem(int i) {

return MyFragment.newInstance(i);

}

public int getCount() {

return NUM_ITEMS;

}

}

Android提供了android.support.design.widget.TabLayout控件,用来实现顶部标题的左右滑动功能。

  1. 在布局文件中添加控件:

<android.support.design.widget.TabLayout

android:id="@+id/tab_layout"

android:layout_width="match_parent"

android:layout_height="wrap_content" />

  1. 让TabLayout与ViewPager关联到一起,由ViewPager管理TabLayout:

TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);

tabLayout.setupWithViewPager(viewPager);

  1. 当然在Adapter中要重写getPageTitle()方法。

官方文档:

https://developer.android.google.cn/reference/android/support/v4/app/FragmentPagerAdapter.html

第03讲 fragment的更多相关文章

  1. 第03讲- 第一个Android项目

    第03讲第一个Android项目 Android项目目录结构: 重要文件: src res AndroidManifest.xml 包含内容: MainActivity.java (程序主视图) 存放 ...

  2. 第03讲:Flink 的编程模型与其他框架比较

    Flink系列文章 第01讲:Flink 的应用场景和架构模型 第02讲:Flink 入门程序 WordCount 和 SQL 实现 第03讲:Flink 的编程模型与其他框架比较 本课时我们主要介绍 ...

  3. PHP学习之[第03讲]PHP5.4 语法、常量、变量、数据类型详解

    1.<?php echo "Hello World"; ?> 2.//注释1,#注释2,/* 注释3 */ 3.系统常量: __FILE__默认常量,是指PHP程序文件 ...

  4. 03讲基础篇:经常说的CPU上下文切换是什么意思(上)

    小结 总结一下,不管是哪种场景导致的上下文切换,你都应该知道: CPU 上下文切换,是保证 Linux 系统正常工作的核心功能之一,一般情况下不需要我们特别关注. 但过多的上下文切换,会把CPU时间消 ...

  5. [小哥Allegro72讲速成视频]

    http://v.qq.com/vplus/df932a993679cf80a0b6c87bb849e22c 第01讲 Allegro常用组件介绍 视频链接:http://v.qq.com/boke/ ...

  6. Android中ViewPager+Fragment取消(禁止)预加载延迟加载(懒加载)问题解决方案

    转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53205878本文出自[DylanAndroid的博客] Android中Vie ...

  7. Android之 Fragment

    什么是Fragment: Android是在Android 3.0 (API level 11)开始引入Fragment的. 可以把Fragment想成Activity中的模块,这个模块有自己的布局, ...

  8. 【Android开发】之Fragment生命周期

    上一篇博客我们讲到了,Fragment的基本使用,相信大家都已经了解怎么去使用了.如果还有不懂得同学可以去看一下,传送门.现在我们来讲解一下Fragment的生命周期. 一.Fragment的事务 再 ...

  9. 关于fragment点击穿透的问题

    当一个activity有多个fragment的时候,点击当前显示的fragment,如果点击处在其他fragment中也有相应的控件,那么可能会点击穿透,有响应另外fragment事件的趋势.但是这个 ...

随机推荐

  1. IPhone下json的解析 NSJSONSerialization

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Programming Lan ...

  2. Codeforces Round #595 (Div. 3) D2Too Many Segments,线段树

    题意:给n个线段,每个线段会覆盖一些点,求删最少的线段,使得每个点覆盖的线段不超过k条. 思路:按右端点排序,之后依次加入每个线段,查询线段覆盖区间内的每个点,覆盖的最大线段数量,如果不超过k,那就可 ...

  3. R语言for循环

    基本语法:for (name in expr_1) expr_2 实例操作: 1.构造矩阵 x=array(,dim=c(,)) # 构造四阶矩阵 数值全为0 :){ :){ x[i,j]=/(i+j ...

  4. 【JS】285- 拆解 JavaScript 中的异步模式

    JavaScript 中有很多种异步编程的方式.callback.promise.generator.async await 甚至 RxJS.我最初接触不同的异步模式时,曾想当然的觉得 promise ...

  5. Koa中间件(middleware)级联原理

    前言 上次看到了koa-compose的代码,今天来说一下koa中间件的级联以及工作原理. 中间件工作原理 初始化koa实例后,我们会用use方法来加载中间件(middleware),会有一个数组来存 ...

  6. Oracle数据库备份/导出(exp/expd)、导入(imp/impd)

    ​ 常用的oracle数据库备份(导入/导出)有两种,分别是exp/imp和expd/impd,前者是Orace早期版本带有的导入导出工具,后者是Oracle10g后出现的,下面进行分别介绍! 1.e ...

  7. Docker容器监控

    利用docker compose组合应用并利用scale可以快速对容器进行扩充,而docker compose启动的服务容器都在同一台宿主机上,对于一个宿主机上运行多个容器应用时,容器的运行情况,如: ...

  8. 从零开始—Socket系统调用和多态封装

    1 重新搭建实验环境 前面都是用实验楼环境做的实验,偷的懒总是要还的,这一次重装环境前后花了十几个小时,踩了无数的坑. 1.1 Ubuntu和LINUX内核的区别 Ubuntu是基于LINUX内核编写 ...

  9. Spring Cloud Alibaba 新一代微服务解决方案

    本篇是「跟我学 Spring Cloud Alibaba」系列的第一篇, 每期文章会在公众号「架构进化论」进行首发更新,欢迎关注. 1.Spring Cloud Alibaba 是什么 Spring ...

  10. [ASP.NET Core 3框架揭秘] 跨平台开发体验: Linux

    如果想体验Linux环境下开发.NET Core应用,我们有多种选择.一种就是在一台物理机上安装原生的Linux,我们可以根据自身的喜好选择某种Linux Distribution,目前来说像RHEL ...