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. BSGS

    北上广深/拔山盖世算法. yaT+b = z mod p p为质数,Hash表存b,枚举a,复杂度p0.5 记得特判y = 0的情况. inline void solve3() { Hash::cle ...

  2. main方法或者junit单元测试报 类找不到异常

    MyEclipse10.7+Maven项目junit单元测试报找不到类异常,附正常编译后的输出设置   1 首先想到的是输出路径错误 一般不是maven工程的项目编译后的.class文件会在/weba ...

  3. 在Vue中如何使用axios跨域访问数据

    最近在项目中需要用到axios,所以就恶补一下这个axios到底是什么东东.越来它是vue-resource的替代品,官网也说了,以后都用axios, vue-resource不在维护.那么这个axi ...

  4. SQL Server 2008以上误操作数据库恢复方法——日志尾部备份

    原文出处:http://blog.csdn.net/dba_huangzj/article/details/8491327 问题: 经常看到有人误删数据,或者误操作,特别是update和delete的 ...

  5. pyglet--旋转的矩形

    展示怎么制作动画.... #-*- coding:utf-8 -*- from pyglet.gl import * from pyglet import clock def draw_rect(x, ...

  6. Python pickle模块

    python的pickle模块实现了基本的数据序列和反序列化.通过pickle模块的序列化操作我们能够将程序中运行的对象信息保存到文件中去,永久存储:通过pickle模块的反序列化操作,我们能够从文件 ...

  7. VBScript进阶篇一

    VBScript进阶篇一       作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.编译型与解释型的区别 其实我们通过一张图就可以大致了解一下,他们运行机制. 想要了解更多,请 ...

  8. netty基础篇

    什么是Bio? 当客户端数量过多时,创建的线程会越来越多,最终服务挂掉,因为客户端的线程数量和服务端创建的线程数量是一一对应的. 什么是伪异步IO? 什么是Nio? 什么是Aio

  9. Spark记录-大数据简介

    什么是大数据 大数据(big data),指无法在一定时间范围内用常规软件工具进行捕捉.管理和处理的数据集合,是需要新处理模式才能具有更强的决策力.洞察发现力和流程优化能力的海量.高增长率和多样化的信 ...

  10. xshell访问Ubuntu16.04显示乱码(即使在xshell设置了utf8)解决方案

    一开始问题是:(无法显示,也无法输入) 然后使用: locale -a 查看服务器安装的全部编码: (且服务器使用的 LANG=C) 只要用: 即可显示中文.也可以输入中文.