fragment做成选项卡,tab效果。

fragment+RadioGroup

from://http://blog.csdn.net/zimo2013/article/details/12239349

1.Fragment概述

在一个Activity中, Fragment代表UI的一个部分或者一个行为。一个Activity可以结合多个Fragment对象,也可以在多个activity中使用相同Fragment字节码对应的不同对象。一个Fragment对象必须被嵌入在一个主Activity对象中,该Fragment的生命周期与主Activity息息相关。比如,当主Activity处于paused状态,其对应的所有Fragment对象均处于paused状态,只有当主Activity处于resumed状态时,Fragment才能处于自由控制状态。

2.创建Fragment

为了创建一个Fragment,应该去继承Fragment或者其子类,覆写相应的方法。比如onCreate(),OnCreateView(),onPause()等等

实例化一个Fragment对象,除了可以new外,还可以使用Fragment的静态函数Fragment.instantiate(mContext, "class 完整路径", info.args);,利用反射实现,但是性能较低

(1).添加UI界面

为该Fragment展现一个布局,必须去实现onCreateView()回掉方法。
注意:当该Fragment继承了ListFragment时,不需要覆写onCreateView()方法,因为默认返回一个ListView对象

  1. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  2. Bundle savedInstanceState) {
  3. View view = inflater.inflate(R.layout.list, null);
  4. return view;
  5. }

(2).添加Fragment到Activity

1).通过layout布局文件

android:name属性应该为Fragment对应类的完整路径。

  1. <fragment
  2. android:id="@+id/f"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"
  5. android:name="com.example.a29fragment.MyFragment"/>

在兼容低版本时,如果使用静态注册,而MyFragment是使用了兼容support.v4.app.Fragment,就不能使用Activity了,只能使用FragmentActivity

fragment静态在xml文件配置,该fragment不能被移除,不可动态被编辑。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="horizontal" >
  6. <fragment
  7. android:id="@+id/list"
  8. android:name="com.example.news.ArticleListFragment"
  9. android:layout_width="0dp"
  10. android:layout_height="match_parent"
  11. android:layout_weight="1" />
  12. <fragment
  13. android:id="@+id/viewer"
  14. android:name="com.example.news.ArticleReaderFragment"
  15. android:layout_width="0dp"
  16. android:layout_height="match_parent"
  17. android:layout_weight="2" />
  18. </LinearLayout>

2).通过Java代码

当Activity运行时,可以自由的在该activity上添加fragment对象,但应该指定一个ViewGroup容器,可以FragmentTransaction完成fragment的添加移除或者替换。

  1. manager = getFragmentManager();
  2. if(manager.findFragmentByTag("right") == null){
  3. manager.beginTransaction().replace(R.id.right, new RightFrag(), "right").commit();
  4. }

(3).fragment唯一标示符

每个fragment需要定义一个唯一的标识符,如果activity被销毁又重新启动,系统能够恢复该fragment的状态。如果想重新恢复,需满足下面有3种方式之一:

1).定义ID

在布局文件中,定义android:id属性

  1. <fragment
  2. android:id="@+id/list"
  3. android:name="com.example.news.ArticleListFragment"
  4. android:layout_width="0dp"
  5. android:layout_height="match_parent"
  6. android:layout_weight="1" />

2).指明tag

android:tag 指明 或者 一个fragment对象add()或者replace()时指定tag

  1. <fragment
  2. android:id="@+id/list"
  3. android:tag="first"
  4. android:name="com.example.news.ArticleListFragment"
  5. android:layout_width="0dp"
  6. android:layout_height="match_parent"
  7. android:layout_weight="1" />

或者

  1. manager.beginTransaction()
  2. .replace(R.id.right, new RightFrag(), "right")//在事务中指明该fragment的tag
  3. .commit();

3).viewgroup ID

如果该fragment均没有id和tag,系统将使用container view布局的id

3.Fragment的管理

通过getFragmentManager()方法,可以得到FragmentManager对象,主要完成下面的功能

  1. FragmentManager manager = getFragmentManager();

(1).得到已经存在Fragment对象

如果该fragment在布局文件中指定了id,通过findFragmentById()得到对象,或者指定了tag可以通过findFragmentByTag()得到对象

  1. Fragment fragment = getFragmentManager().findFragmentByTag("right");
  2. //or
  3. Fragment fragment = getFragmentManager().findFragmentById(id);

(2).注册OnBackStackChangedListener监听器

可以用来监听该任务对应的返回栈信息,当该返回栈状态发生改变时,执行对应的onBackStackChanged() 方法

  1. manager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
  2. @Override
  3. public void onBackStackChanged() {
  4. Toast.makeText(MainActivity.this, "返回堆状态发生改变", 1).show();
  5. }
  6. });

(3).弹出返回栈

模拟用户点击返回键,将指定的fragment从返回栈中弹出,该操作为异步的。前提是该fragment对象使用.beginTransaction().addToBackStack("right")添加了进返回栈

  1. manager.popBackStack(); //Pop the top state off the back stack

(4).FragmentTransaction事务

事务主要包含一些操作的集合,比如增加移除替换,动画设置等等

  1. /*
  2. * 通过manager开启一个事务,该事务包含一些操作的集合,通事务可以 add(), remove(), replace()
  3. * 完成对Fragment的操作,并使用commit()提交
  4. */
  5. FragmentTransaction transaction = manager.beginTransaction();
  6. transaction.replace(R.id.right, new RightFrag(), "right");
  7. transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);//设置动画
  8. transaction.addToBackStack("right"); // 将该fragment加入返回堆
  9. // 提交事务
  10. transaction.commit();

(5).Fragment状态管理

  1. /*
  2. * 管理Fragment的状态
  3. *  如果在一个主activityViewGroup中添加一个fragment,
  4. *  如果手机屏幕旋转了,当前activity被销毁重建,fragment也被activityManager创建
  5. *  故在onCreate中,需要判断一下
  6. */
  7. @Override
  8. protected void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.activity_main);
  11. manager = getFragmentManager();
  12. if (manager.findFragmentByTag("right") == null) {
  13. // if(savedInstanceState == null)也可判断该fragment是否已经加载
  14. manager.beginTransaction()
  15. .replace(R.id.right, new RightFrag(), "right")
  16. .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)// 设置动画
  17. .addToBackStack("right") // 将该fragment加入返回堆
  18. // 提交事务
  19. .commit();
  20. }
  21. }

4.向下兼容

可参阅CursorLoader的兼容~~,特别注意:如果使用静态注册,在布局文件配置<fragment>标签时,指定了name的class由于兼容support.v4.app.Fragment,加载布局文件的Class就不能继承Activity了,只能继承FragmentActivity

5.Fragment间信息交互

(1).取得对象

  1. /*
  2. * 点击该Fragment的button按钮,将该button的text设置为另一个fragment中Edittext的文本值
  3. */
  4. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  5. Bundle savedInstanceState) {
  6. View view = inflater.inflate(R.layout.list, null);
  7. final Button button = (Button) view.findViewById(R.id.confirm);
  8. button.setOnClickListener(new View.OnClickListener() {
  9. @Override
  10. public void onClick(View v) {
  11. //通过FragmentManager找到另一个fragment中的edittext对象,并取得text内容
  12. EditText editText = (EditText)(getFragmentManager().findFragmentByTag("left").getView().findViewById(R.id.name));
  13. button.setText(editText.getText().toString());
  14. }
  15. });
  16. return view;
  17. }

(2).通回掉函数

  1. public class MainActivity extends Activity {
  2. private FragmentManager manager;
  3. private Button button;
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.activity_main);
  8. button.setOnClickListener(new View.OnClickListener() {
  9. @Override
  10. public void onClick(View v) {
  11. RightFragment rightFrag = (RightFragment) (getFragmentManager().findFragmentByTag("right"));
  12. /*
  13. * 通过set方法,向其传递一个实例化对象,由于rightFrag.set()方法内部执行RightFragment.CallBack.get()方法,完成了参数的传递
  14. */
  15. rightFrag.set(new RightFragment.CallBack() {
  16. @Override
  17. public void get(String str) {
  18. button.setText(str);
  19. }
  20. });
  21. }
  22. });
  23. }
  24. }
  1. public class RightFragment extends ListFragment {
  2. private LoaderManager manager;
  3. @Override
  4. public void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. manager = getLoaderManager();
  7. }
  8. /*
  9. * 点击该Fragment的button按钮,将该button的text设置为另一个fragment中Edittext的文本值
  10. */
  11. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  12. Bundle savedInstanceState) {
  13. View view = inflater.inflate(R.layout.list, null);
  14. return view;
  15. }
  16. /**
  17. * 通过调用该方法,接收一个回掉函数对象,callBack.get(str);
  18. * @param callBack
  19. */
  20. public void set(CallBack callBack) {
  21. EditText editText = (EditText) getView().findViewById(R.id.name);
  22. callBack.get(editText.getText().toString());
  23. }
  24. /*
  25. * 回掉接口
  26. */
  27. interface CallBack {
  28. public void get(String str);
  29. }
  30. }

6.Fragment的生命周期

(1).生命周期路线图

生命状态

周期过程

 

foreground lifetime

onResume(A)

onResume(F)

onPause(F)

onPause(A)

visible lifetime

onCreateView(F)

onActivityCreated(F)

onStart(A)

onStart(F)

onResume(A)

onResume(F)

onPause(F)

onPause(A)

onStop(F)

onStop(A)

onDestroyView(F)

entire lifetime

完整的生命周期

(2).生命周期回掉函数概述

方法 描述
onAttach(Activity)

当前Fragment与Activity关联,调用!

onCreate()

完成fragment的初始化创建

  onCreateView()

创建并返回与当前fragment相关联的层次视图view

  onActivityCreated()

主activity的onCreate()执行完后,该方法才执行

  onStart()

fragment可见,当主activity处于started状态后执行

    onResume()

fragment能与用户交互,当主activity处于resumed状态后执行

    onPause()

fragment不在与用户交互,可能在主activity将要处于paused前执行,可能该fragment被修改

  onStop()

fragment不在可见,可能在主activity将要处于stopped前执行,可能该fragment被修改

  onDestroyView()

允许该fragment清理视图相关资源

onDestroy()

清理掉视图state信息

onDetach()

该fragment不在于activity关联

fragment做成选项卡,tab效果。 fragment+RadioGroup的更多相关文章

  1. 使用ViewPager+Fragment实现选项卡切换效果

    实现效果 本实例主要实现用ViewPage和Fragment实现选项卡切换效果,选项卡个数为3个,点击选项卡或滑动屏幕会切换Fragment并实现选项卡下方下边框条跟随移动效果. 本程序用androi ...

  2. 使用Fragment实现Tab效果

    在上一篇中,我们将了使用ViewPager实现Tab效果.如果没有阅读过,可以点击下面的地址: http://www.cnblogs.com/fuly550871915/p/4849893.html ...

  3. Fragment实现底部选项卡切换效果

    现在很多APP的样式都是底部选项卡做为首页的,实现这样的效果,我们一般有这样几种方式,第一,最屌丝的做法,我直接自定义选项卡视图,通过监听选项卡视图,逻辑控制内容页的切换,这样做的想法一般是反正这几个 ...

  4. Android典型界面设计——FragmentTabHost+Fragment实现底部tab切换

    一.问题描述 在上次博文中,我们使用RadioGroup+ViewPage+Fragmen实现了顶部滑动导航(查看文章:http://www.cnblogs.com/jerehedu/p/460759 ...

  5. Android - FragmentTabHost 与 Fragment 制作页面切换效果

    使用 FragmentTabHost 与 Fragment 制作页面切换效果 API 19 TabHost已经不建议使用了.用 FragmentTabHost 来代替TabHost.实际上 Fragm ...

  6. Android - TabHost 与 Fragment 制作页面切换效果

    Android - TabHost 与 Fragment 制作页面切换效果 Android API 19 , API 23 三个标签页置于顶端 效果图: 在文件BoardTabHost.java中定义 ...

  7. Android Studio精彩案例(二)《仿微信动态点击底部tab切换Fragment》

    转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 现在很多的App要么顶部带有tab,要么就底部带有tab.用户通过点击tab从而切换不同的页面(大部分情况时去切换fragment). ...

  8. 仿百度壁纸客户端(一)——主框架搭建,自定义Tab+ViewPager+Fragment

    仿百度壁纸客户端(一)--主框架搭建,自定义Tab+ViewPager+Fragment 百度壁纸系列 仿百度壁纸客户端(一)--主框架搭建,自定义Tab + ViewPager + Fragment ...

  9. 用Fragment制作的Tab页面产生的UI重叠问题

    本文出处:http://blog.csdn.net/twilight041132/article/details/43812745 在用Fragment做Tab页面,发现有时候进入应用会同时显示多个T ...

随机推荐

  1. python3.6连接oracle数据库

    下载cx_Oracle模块模块: https://pypi.python.org/pypi/cx_Oracle/5.2.1#downloads 这里下载的是源码进行安装 [root@oracle or ...

  2. linux shell 脚本攻略学习12--文件权限详解,chmod命令详解,chown命令详解,chattr命令详解

    文件权限详解 一.chmod命令详解 文件权限和所有权是Unix/Linux文件系统最显著的特征之一.linux中的每一个文件都与多种权限类型相关联,在这些权限中主要分类为3种: 用户(User)是文 ...

  3. kebab HDU2883

    题意:现在有n个人要烤肉,有m个烤肉架,然后给出每个人的烤肉开始时间si,结束时间ei,以及要烤肉的串数num,还有拷一串的时间ti,然后问你能不能满足所有人的要求. 为3572的进阶题 每个人为一个 ...

  4. 怎么去除移动端点击a标签链接时的背景色

    在手机端点击链接时会发现有一个背景色,有时候需要改变这个颜色,或者去除这个颜色,有时候a标签做成按钮时这个颜色的存在会很丑,像这样: 可以通过 -webkit-tap-highlight-color: ...

  5. [Java/Python] java调用python脚本问题记录

    Java调用Python的的两种方式 1.Runtime private static String call_python(String input_argv) { String python_py ...

  6. Eclipse下Maven新建项目、自动打依赖jar包(包含普通项目和Web项目)

    不多说,直接上干货! 当我们无法从本地仓库找到需要的构件的时候,就会从远程仓库下载构件至本地仓库.一般地,对于每个人来说,书房只有一个,但外面的书店有很多,类似第,对于Maven来说,每个用户只有一个 ...

  7. Python3 决策树ID3算法实现

    # -*- coding: utf-8 -*- """ Created on Wed Jan 24 19:01:40 2018 @author: markli 采用信息增 ...

  8. Java死锁排查和Java CPU 100% 排查的步骤整理

    ================================================= 人工智能教程.零基础!通俗易懂!风趣幽默!大家可以看看是否对自己有帮助! 点击查看高清无码教程 == ...

  9. 3D游戏开发之UE4中的集合:TSet容器

    好久没有更新了,最近一直在老家过年,网络不通的,今天才有时间更新一集. 一.TSet<T>是什么 UE4中,除了TArray动态数组外,还提供了各种各样的模板容器.这一节,我们就介绍集合容 ...

  10. BeanUtils工具

    什么是BeanUtils工具 BeanUtils工具是一种方便我们对JavaBean进行操作的工具,是Apache组织下的产品. BeanUtils工具一般可以方便javaBean的哪些操作? 1)b ...