Android用户界面开发:Fragment

1:注意事项
  3.0以前的Android 版本要使用FragmentActivity 来装载Fragment ,使用到support v4包。
  3.0以后的版本可以直接在Activity里面添加Fragment。
2:Fragment也有生命周期,继承Fragment 要重新onCreateView方法,另外onResume,onDestroyView 等方法根据需要填写。
重写onCreateView()方法:
public class Fragment1 extends Fragment{

@Override

public View onCreateView(LayoutInflater inflater,ViewGroup container, Bundle savedInstanceState){
    // Inflate the layout for this fragment
return Inflater.inflate(
R.layout.fragment1, container,  false);
    }

}
这里使用了LayoutInflater对象从指定的XML文件(本例中是R.layout.fragment1)来构造UI。container参数指定了父ViewGroup,即在其中嵌入该Fragment的活动。savedInstanceState参数使得能够将该Fragment恢复至之前保存的状态。

3:在activity中加入Fragment有两种方法:布局和代码动态加入。布局加入和在布局加入view,button等用法一样。
要想向活动中添加Fragment,需要使用<fragment>元素:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

<fragment
android:name=".Fragment1"
android:id="@+id/fragment1"
    android:layout_weight="1"
android:layout_width="0px"
android:layout_height="match_parent" />
    <fragment
android:name=".Fragment2"
android:id="@+id/fragment2"
android:layout_weight="1"

android:layout_width="0px"
android:layout_height="match_parent" />

</LinearLayout>
可注意到,每个Fragment都需要一个唯一标识符。可以通过android:id或android:tag属性指定。

4:在Activity中动态加入Fragment google 教程http://developer.android.com/training/basics/fragments/fragment-ui.html

// 创建一个Fragment实例
HeadlinesFragment firstFragment = new HeadlinesFragment();
firstFragment.setArguments(getIntent().getExtras());
getSupportFragmentManager().beginTransaction().add(R.id.fragment_container, firstFragment).commit();

5:一个Fragment替换另一个Fragment
ArticleFragment newFragment = new ArticleFragment();
//要传递给newFragment的信息,可以来自于其它Fragment
Bundle args = new Bundle();
args.putInt(ArticleFragment.ARG_POSITION, position);
newFragment.setArguments(args);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(“xxxxx”);//一个字符串标识
transaction.commit();
要想点击back可以返回上一个fragment ,transaction.addToBackStack(“xxxxx”);//一个字符串标识,这个必须有。

6:Fragment 替换另一个Fragment时 数据传递
例如:点击fragmentA 中的一个按钮 启动fragmentB ,FragmentActivity 是 activityFragment
(1)通过Intent传递数据
Intent  intent = new Intent();
//把数据加入intent中
intent.putExtra("xxx", xxx);
intent.putExtra("xxx", xxx);    
......
activityFragment .setIntent(intent);
//启用事务,完成Fragment的转换。
FragmentTransaction transaction = activityFragment.getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.xxx, fragmentB);
//使用 add() 方法添加一个fragment
transaction.add(R.id.fragment_container,fragment);
add()的第一个参数是fragment要放入的ViewGroup, 由resource ID指定,第二个参数是需要添加的fragment。一旦用FragmentTransaction做了改变,为了使改变生效,必须调用commit()。
//不将被替换的fragment加入栈中,点击返回调用系统默认的方法onBackPress()时不会返回上一个fragment
transaction.addToBackStack("msg_fragment");
transaction.commit();
(2) 通过setfragment.setArguments(Bundle args)
Bundle bundle = new Bundle();
//往Bundle中放入数据
Bundle.put(xxxx);
.....
fragmentB.setArgument();
//启用事务,完成Fragment的转换。
FragmentTransaction transaction = activityFragment.getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.xxx, fragmentB);
//不将被替换的fragment加入栈中,点击返回调用系统默认的方法onBackPress()时不会返回上一个fragment
transaction.addToBackStack("msg_fragment");
transaction.commit();
在fragmentB中 通过fragmentB.getArgument();方法获得Bundle,再取出数据。

7:关于Context 的使用
我在fragmentA创建一个自定义的dialog时 出现如下异常
06-24 14:34:52.147: E/AndroidRuntime(4853): FATAL EXCEPTION: main
06-24 14:34:52.147: E/AndroidRuntime(4853): java.lang.RuntimeException: Unable to resume activity {xxx}: java.lang.RuntimeException: Unable to resume activity {xxxxx.MsgActGroup}: java.lang.RuntimeException: Unable to resume activity {xxxx/com...MsgFragmentAct}: android.view.WindowManager$BadTokenException: Unable to add window -- token android.app.LocalActivityManager$LocalActivityRecord@4054d430 is not valid; is your activity running?
情况是这样:fragmentActivity 是ActivityGroup的一个子Activity,fragmenA是fragmentActivity 的一个Fragment。这个异常可以翻译成:fragmentA现在还处于运行状态吗?
可能是创建dialog时传入的context 即 fragmentA.getActivity() 即fragmentActivity 有问题。改成fragmentA.getActivity().getParent()。问题得到解决。

参考链接:http://www.apkbus.com/forum.php?mod=viewthread&tid=122431

Google 提供的教程:http://developer.android.com/training/basics/fragments/index.html

Android用户界面开发:Fragment的更多相关文章

  1. Android零基础入门第16节:Android用户界面开发概述

    原文:Android零基础入门第16节:Android用户界面开发概述 相信通过前面15期的学习,Android的开发环境已经基本掌握了,如果仍有问题,欢迎到Android零基础入门技术讨论微信群交流 ...

  2. Android用户界面开发:TabHost

    TabHost是整个Tab的容器,包括两部分,TabWidget和FrameLayout.TabWidget就是每个tab的标签,FrameLayout则是tab内容.TabHost的二种实现方式:第 ...

  3. Android开发 ---Fragment片段布局

    前言 Fragment想必大家不陌生吧,在日常开发中,对于Fragment的使用也很频繁,现在主流的APP中,基本的架构也都是一个主页,然后每个Tab项用Fragment做布局,不同选项做切换,使用起 ...

  4. Android UI开发第三十篇——使用Fragment构建灵活的桌面

    http://www.lupaworld.com/article-222973-1.html 当我们设计应用程序时,希望能够尽最大限度的适配各种设备,包括4寸屏.7寸屏. 10寸屏等等,Android ...

  5. Android UI开发详解之Fragment

    Fragment是Android自从3.0之后新加入的一个组件,我相信很多人都已经听说过这个组件了,但这个组件到底是个什么,如何去使用他呢,且听我讲来. 以下部分资料来自官网(官网才是王道,其他都是浮 ...

  6. Android开发——Fragment的简单使用总结

    前言: 之前搞项目的时候,就使用了这个Fragment,中间遇到了许多坑,把坑都解决了,现在写一篇较为简单的Fragment使用总结 Fragment的简单介绍: 简单来说,Fragment其实可以理 ...

  7. Android项目开发填坑记-Fragment的onBackPressed

    Github版 CSDN版 知识背景 Fragment在当前的Android开发中,有两种引用方式,一个是 Android 3.0 时加入的,一个是supportV4包中的.这里简称为Fragment ...

  8. Android项目开发填坑记-Fragment的onAttach

    背景 现在Android开发多使用一个Activity管理多个Fragment进行开发,不免需要两者相互传递数据,一般是给Fragment添加回调接口,让Activity继承并实现. 回调接口一般都写 ...

  9. Android开发——Fragment知识整理(二)

    0.  前言 Android开发中的Fragment的应用非常广泛,在Android开发--Fragment知识整理(一)中简单介绍了关于Fragment的生命周期,常用API,回退栈的应用等知识.这 ...

随机推荐

  1. CDQZ.OPENJUDGE DataStructure22

    我觉得这是很重要的一些题目.它们都在这里:硕巨结构 Challenge 0:给定数列,单点修改,单点查询修改.煞有介事,不过一数组耳. Challenge 1:给定数列,单点修改,单点查询第k次操作后 ...

  2. A1078. Hashing

    The task of this problem is simple: insert a sequence of distinct positive integers into a hash tabl ...

  3. 【LOJ#6282】数列分块6

    题目大意:给定一个由 N 个数组成的序列,维护两种操作:单点询问,单点插入.N < 100000 题解:在块内维护一个链表,支持动态插入数字,同时对于非随即数据来说,若块的大小过大,需要重构. ...

  4. NOIP 普及组 2014 珠心算测验

    传送门 https://www.cnblogs.com/violet-acmer/p/9898636.html 题解: 枚举两两间出所有的可能加和,然后遍历一遍这 n 个数,找出满足条件的总个数. 这 ...

  5. xkcd 单线程下载图片

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...

  6. Linux shell 自启动脚本写法

    直接上脚本内容 #!/bin/bash #chkconfig: 2345 80 90 #description:sniffer #第一行,告诉系统使用的shell,所以的shell脚本都是这样. #第 ...

  7. 金融量化分析【day113】:羊驼策略

    零.动量策略VS反转策略 1.实现代码 # 导入函数库 import jqdata import pandas as pd import numpy as np import datetime imp ...

  8. Java IO笔记

    第一:File类(主要获取文件名,判断文件是否存在,创建或者删除文件) 举个例子,代码如下: import java.io.File; public class Main{ public static ...

  9. springboot的注解详解

    配置类相关: @PropertySource(value = "classpath:test.properties")   //我们都把配置文件写到application.yml中 ...

  10. 使用MedleyText与Syncthink自建云笔记

    随着学习加深,做的笔记越来越多,而使用云笔记怕万一平台关闭(如360网盘啥的)还需要导出笔记费时费力,并且多平台兼容性未知.还是自己搭建放心省事. MedleyText介绍 MedleyText为ma ...