博客的感悟,终点-開始

这个是基础的最后一篇博客了,学习了非常多,也有非常多感触。

就在这里大致总结一下。

坚持往往非常难,完美的坚持下去更难。这是写这十八篇博客的感悟。

时间流失的非常快,总是感觉时间不够用。

慢慢的就会让自己博客的质量下降。今天反思了一下,我这样不就是在制造“破窗户”吗?(破窗户理论不知道的能够去看一下)

写到第十八篇,感觉思路乱了非常多。果然看“知识点”和组织语言描写叙述 “知识点”还是有非常差的区别的。

这是基础的最后一篇博客。即是个结束,也是个開始。结束的是自己不认真的态度,開始的是Android全新的旅程。

学无止境。技术无止境。从今天開始敦促自己,认真、认真、再认真。

机遇可能碰到你,可是假设你没有之前辛勤的汗水,便无法抓住。

什么是Fragment

Fragment它是在Android3.0时被引入的,主要用于在大屏幕设备上。支持动态和更灵活的UI设计(比如平板)。

Fragment是表现Activity中UI的一个行为或者一部分。能够把fragment想象成activity的一个模块化区域。有它自己的生命周期,接收属于它自己的输入事件,而且能够在activity执行期间加入和删除(有点像一个能够在不同的activity中重用的“子Activity”)。

Fragment必须被嵌入到一个activity中。它们的生命周期直接受其宿主activity的生命周期影响。当一个activity正在执行时,就能够独立地操作每个Fragment,比方加入或删除它们。

Fragment能够定义自己的布局、生命周期回调方法,因此能够将fragment重用到多个activity中,因此能够依据不同的屏幕尺寸或者使用场合改变fragment组合。

加入fragment到Activity的两种方式

方式一。插入<fragmetn>作为布局的子元素,能够依照以下步骤:

①在布局文件里加入<fragment>标签。并指定android:name属性为一个继承Fragment的类。

<?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="horizontal" > <fragment
android:id="@+id/list"
android:name="com.bzh.layout.Fragment1"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
</LinearLayout>

②创建继承Fragment的类,并重写onCreateView()方法,在当中使用inflate.inflate(R.layout.fragment1,null)使用XML文件生成一个View对象。作为fragment的根布局

public class Fragment1  extends Fragment{

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment1, null);
return view;
}
}

③创建名为fragment1的布局文件

<?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:layout_width="match_parent"
android:layout_height="match_parent"
android:text="我是Fragment1" />
</LinearLayout>

结果例如以下:

直接在布局文件里使用<fragment>元素的步骤还是比較简单。可是能够看得出,还是不灵活,同一时候在实际使用中也使用的不多。

另外。每个fragment都须要一个唯一的标识。假设activity重新启动,系统能够用来恢复Fragment,而且能够用id来捕获Fragment来处理事务,比如移除它。有3种方法来为一个fragment提供一个ID:
使用android:id属性提供一个唯一ID;
使用android:tag属性提供一个唯一字符串;
假设以上2个你都没有提供。系统将使用容器view的ID;
方式二。使用编码的方式把fragment加入或替换到已经存在的ViewGroup布局中。
和第一种方式一样的地方时,我们依然须要准备一个继承Fragment的类,和为其准备一个布局文件。在onCreateView()回调中。使用填充器返回它的实例作为布局。

不同的地方在于。假设动态的加入或者替换,我们须要使用FragmentManager类,并开启事务,当然最后也要提交事务。

WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
int height = wm.getDefaultDisplay().getHeight();
int width = wm.getDefaultDisplay().getWidth(); // 获取Fragment管理器
FragmentManager fragmentManager = getFragmentManager(); // 开启事务
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); if (height > width) {
// 使用Fragment替换指定的布局
fragmentTransaction.replace(android.R.id.content, new Fragment1());
} else {
// 使用Fragment替换指定的布局
fragmentTransaction.replace(android.R.id.content, new Fragment2());
} // 提交事务
fragmentTransaction.commit();

Fragment的生命周期

Fragment的生命周期和activity生命周期非常像。
onAttach:绑定到activity
onCreate:创建fragment
onCreateView: 创建fragment的布局
onActivityCreated: activity创建完毕后
onStart: 可见, 不可交互
onResume: 可见, 可交互
onPause: 部分可见, 不可交互
onStop:不可见
onDestroyView: 销毁fragment的view对象
onDestroy: fragment销毁了
onDetach: 从activity解绑了
在实际开发中。当然不会所有重写,Google推荐我们至少要重写一下三个方法:
onCreate()在fragment被创建时。我们能够初始化一些组件。
onCreateView()当第一次绘制fragmetn界面时。我们必须返回一个View对象作为fragmetn的根布局。

onPause()当fragment不能够和用户交互时。

Fragment的向下兼容

Fragment是在Android 3.0才推出的。若想在3.0的低版本号下使用Fragment,则须要执行以下2步:
把所有Fragment和FragmentManager改成support-v4包下的类
把Activity的继承改为FragmentActivity(support-v4包下的)

Fragment之间的通信

两个Fragment之间的通信主要是借助给Fragment对象设置一个Tag,和使用FragmentManager.findFragmentByTag()方法,找到为Tag的Fragment对象,从而达到交流的目的。

以下通过一个小案例来使用一下。在主布局中,左右有两个LinearLayout布局,在代码中分别被Fragment1Fragment2填充。

当中Fragment1中包括一个Button,能够改动Fragment2TextView内容。

首先在MainActivity中把两个Fragment替换到指定的布局中

LinearLayout ll1 = (LinearLayout) findViewById(R.id.ll1);
LinearLayout ll2 = (LinearLayout) findViewById(R.id.ll2); FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction(); // 给Fragment1对象设置tag为fragment1
ft.replace(R.id.ll1, new Fragment1() ,"fragment1");
// 给Fragment1对象设置tag为fragment2
ft.replace(R.id.ll2, new Fragment2(), "fragment2"); ft.commit();

在Fragment2中。我们须要给外界暴露出改动TextView内容的方法,也非常easy:

public class Fragment2 extends Fragment {

    private TextView tv;

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment2, null);
tv = (TextView) view.findViewById(R.id.tv);
return view;
}
// 暴露给外界改动TextView的方法
public void setTextView(String content) {
tv.setText(content);
}
}

接下来的事情就非常easy了。在Fragment1中,依据Tag找到Fragment2对象,再改动就OK了。

public class Fragment1 extends Fragment {

    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment1, null);
Button btn = (Button) view.findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// 借助Fragment管理器找到带有tag的对象
Fragment2 f2 = (Fragment2) getFragmentManager().findFragmentByTag("fragment2");
f2.setTextView("我去你妹的");
}
});
return view;
}
}

Android基础笔记(十八)- Fragment的更多相关文章

  1. <Android 基础(十八)> XLIFF

    介绍 XLIFF ,XML Localization Interchange File Format,XML本地化数据交换格式. 实际使用 1.布局文件 activity_main.xml <? ...

  2. Bootstrap <基础二十八>列表组

    列表组.列表组件用于以列表形式呈现复杂的和自定义的内容.创建一个基本的列表组的步骤如下: 向元素 <ul> 添加 class .list-group. 向 <li> 添加 cl ...

  3. Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(上)

    前言 Android中绘图离不开的就是Canvas了,Canvas是一个庞大的知识体系,有Java层的,也有jni层深入到Framework.Canvas有许多的知识内容,构建了一个武器库一般,所谓十 ...

  4. Android为TV端助力 转载:Android绘图Canvas十八般武器之Shader详解及实战篇(下)

    LinearGradient 线性渐变渲染器 LinearGradient中文翻译过来就是线性渐变的意思.线性渐变通俗来讲就是给起点设置一个颜色值如#faf84d,终点设置一个颜色值如#CC423C, ...

  5. python3.4学习笔记(十八) pycharm 安装使用、注册码、显示行号和字体大小等常用设置

    python3.4学习笔记(十八) pycharm 安装使用.注册码.显示行号和字体大小等常用设置Download JetBrains Python IDE :: PyCharmhttp://www. ...

  6. Android笔记(六十八) Fragment总结

    Fragment的产生: 为了适应各种尺寸的屏幕,谷歌推出Fragment,可以把Fragment成Activity的一个组成部分,它拥有自己的生命周期.可以接收并处理用户的各种事件,还可以动态的增删 ...

  7. Android进阶(二十八)上下文菜单ContextMenu使用案例

    上下文菜单ContextMenu使用案例 前言 回顾之前的应用程序,发现之前创建的选项菜单无法显示了.按照正常逻辑来说,左图中在"商品信息"一栏中应该存在选项菜单,用户可进行分享等 ...

  8. (C/C++学习笔记) 十八. 继承和多态

    十八. 继承和多态 ● 继承的概念 继承(inheritance): 以旧类为基础创建新类, 新类包含了旧类的数据成员和成员函数(除了构造函数和析构函数), 并且可以派生类中定义新成员. 形式: cl ...

  9. 【转】 Pro Android学习笔记(八八):了解Handler(2):什么是Handler

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 之前我们有一篇很好的博文<Andro ...

随机推荐

  1. 字符串进行富文本操作后末尾emoji表情显示会乱码

    问题描述: 1.UIlabel展示的text中包含emoji表情 2.emoji表情作为最后一个字符 在满足以上条件的前提下末尾的emoji会乱码. 寻找问题过程: 因为是在单独的机型上出现的问题,所 ...

  2. 牛客网 暑期ACM多校训练营(第一场)J.Different Integers-区间两侧不同数字的个数-离线树状数组 or 可持久化线段树(主席树)

    J.Different Integers 题意就是给你l,r,问你在区间两侧的[1,l]和[r,n]中,不同数的个数. 两种思路: 1.将数组长度扩大两倍,for(int i=n+1;i<=2* ...

  3. Codeforces #425 Div2 D

    #425 Div2 D 题意 给出一个树形图,每次询问给出三个点,从其中选择两个作为起始点,一个终点,求从两个起始点出发(走最短路)到达终点经过的共同的点最多的数量. 分析 这种树上点与点之间距离有关 ...

  4. poj1743(后缀数组)

    poj1743 题意 给出一个数字序列(串),现在要去寻找一个满足下列条件的子串: 长度不小于 5 存在重复的子串(如果把一个子串的所有数字都加上或减去一个值,与另一子串的数字对应相同,我们称它们重复 ...

  5. hdu 4826 Labyrinth DP

    题目链接:HDU - 4826 度度熊是一只喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫只能从矩阵左上角第一个方格开始走,只有走到右上角的第一个格子才算走出迷宫,每一次只能走一格,且只能向 ...

  6. 解魔方的机器人攻略15 – 安装 Eclipse

    由 动力老男孩 发表于 2009/12/27 17:40:49 在远古时代,程序员们通常用写字板来编写Java程序,然后用Javac.exe和Java.exe来编译和执行.对于NXT来说,对应的命令是 ...

  7. linux tail指令

    http://www.cnblogs.com/peida/archive/2012/11/07/2758084.html tail -f file,  check the log file tail  ...

  8. 【MyEcplise】新装系统,新装的myEcplise使用原来的workspace和maven库,项目没错但是引用的包不能正确找到

    项目中都是原来的正确的项目,但是有个感叹号 正确方法: 更新之后如果有别的问题,例如JDK版本变成原始版本等等,请在build path中调整. 并且修改 项目的编译JDK版本 右键项目propert ...

  9. [置顶] kubernetes--资源管理

    概念 默认情况下,kubernetes不会限制pod等资源对象使用系统资源,单个pod或者容器可以无限制使用系统资源. kubernetes的资源管理分为资源请求(request)和资源限制(limi ...

  10. IP头,TCP头,UDP头,MAC帧头定义

    一.MAC帧头定义 /*数据帧定义,头14个字节,尾4个字节*/ typedef struct _MAC_FRAME_HEADER {  char m_cDstMacAddress[6];    // ...