fragment做成选项卡,tab效果。 fragment+RadioGroup

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对象

[java] view plaincopy

  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对应类的完整路径。

[html] view plaincopy

  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不能被移除,不可动态被编辑。

[html] view plaincopy

  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的添加移除或者替换。

[java] view plaincopy

  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属性

[html] view plaincopy

  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

[html] view plaincopy

  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" />

或者

[java] view plaincopy

  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对象,主要完成下面的功能

[java] view plaincopy

  1. FragmentManager manager = getFragmentManager();

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

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

[java] view plaincopy

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

(2).注册OnBackStackChangedListener监听器

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

[java] view plaincopy

  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")添加了进返回栈

[java] view plaincopy

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

(4).FragmentTransaction事务

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

[html] view plaincopy

  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状态管理

[java] view plaincopy

  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).取得对象

[java] view plaincopy

  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).通回掉函数

[java] view plaincopy

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

[java] view plaincopy

  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

时间: 2024-10-10 07:25:01

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

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

参考链接:http://www.jianshu.com/p/7bc9a1ff137e http://www.devstore.cn/code/info/245.html http://www.tuicool.com/articles/FfeiumV 本人参考了三篇文章来写这个页面,但是运行这上面给出的源码,发现每个fragment的flag并不能实现切换. 要实现的效果如下: 在activity_main.xml中设置布局.xml内容如下: <LinearLayout xmlns:android

使用Fragment实现Tab效果

在上一篇中,我们将了使用ViewPager实现Tab效果.如果没有阅读过,可以点击下面的地址: http://www.cnblogs.com/fuly550871915/p/4849893.html 在这一篇中我们讲一下使用Fragment实现Tab效果,而这种实现方式也是推荐的方式.与用ViewPager实现的效果有一点不同. 一.效果展示 如下图:                                   使用Fragment不支持手指左右滑动,只支持底部按钮的点击来切换.它的中间

Android ViewPager+Fragment滑动选项卡,tab点击选项卡

有一段时间一直再研究这个,自Android 3.0以后,很少开发者再用以前的TabWidget控件了.那种效果不是很好,也不能滑动.后来陆续出现了各种各样滑动选项卡,每种的出现都各有优势吧.但我还是推荐ViewPager+Fragment滑动选项卡,tab点击选项卡.因为横屏或者竖屏效果都还不错,针对这种效果,还有一种开源框架的出现.接下来会有所介绍. 转载请注明出处:http://blog.csdn.net/qq_16064871 本文demo下载:请点击 一.ViewPagerActivit

使用Fragment来实现Tab的效果

前一篇文章实现了使用ViewPager来实现Tab的效果,这篇来介绍使用Fragment来实现Tab的效果. 下面给出上一篇的地址:http://www.cnblogs.com/mengyan1124/p/4675524.html 实现效果是同前一篇一样的,而布局文件也仅仅只有activity_main.xml发生了一点变化,此文件代码如下: 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&

一起来搭App框架(侧滑与toolbar联动+选项卡(viewpager+fragment+radiogruop)+optionMenu)

1.概述 最近在学车,抽着空写了一个常用的App框架,可惜不会制作gif图片,请忽略录屏软件的那个浮动窗口,要是有更好的方式制作gif麻烦告知下提前感谢,效果图如下,凑合着看下吧. 主要实现了 [1]使用RadioGroup处理选项卡优化布局 [2]使用ToolBar跟侧滑图表联动,效果更好 [3]集合了viewerPager+fragment,drawerlayout+toolbar,optionmenu以及circleImageView处理头像等功能 一般app项目应该可以应付了.下面说下实

底边栏Tab切换Fragment,带角标显示效果

类似于手机版qq的底边栏Tab效果有很多种实现方法,比如TabActivity.自定义RadioGroup等.由于高版本下TabActivity已经被废弃,而且Activity比较重量级,所以一般不使用TabActivity.这里分享一种我写的自定义底部Tab的方法,顺带加上底部标签的角标显示效果.效果如下: 关于Demo需要交代几点: 1.这个Demo中并没有对尺寸做适配,在不同机型的手机上运行需要调整代码中的尺寸相关代码. 2.角标效果只是个演示效果,逻辑可能并不合理,具体显示或者改变.隐藏

处女男学Android(十一)---Gallery、ViewPager和ViewPager+Fragment实现的Tab导航

一.前言 有阵子没更新博客了,主要是最近公司接了个P2P的金融借贷项目没人做,被拉去写服务端,所以迟迟没时间继续学习大安卓,想了想自己的安卓水平和公司的专业安卓璟博比起来依旧差距挺大,于是乎我要加把劲赶上才行,所以继续翻开李刚疯狂讲义系列,看到Gallery这个控件了,大致功能是横向滚动查看列表项,再仔细看了一下居然过时了,官方推荐用ViewPager来替代,还没学就过时了,有点不爽,干脆新的旧的一起学习一下,也好进行一下比较吧.废话不多说,首先是已经过时的Gallery. 二.画廊视图Gall

Android UI之Tab(ActionBar+Fragment实现)

Fragment和ActionBar都是Android3.0之后出现的,Fragment,碎片,主要是为了支持更多的UI设计在大屏幕设备上,如平板.因为现在设备的屏幕越来越大,使用Fragment可以更灵活的管理视图层次的变化.像Activity一样,可以创建Fragment来包含View,进行布局,但是Fragment必须嵌入在Activity中,不能单独存在,而且一个Activity可以嵌入多个Fragment,同时一个Fragment可以被多个Activity重用.Action Bar被认

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

Android典型界面设计——FragmentTabHost+Fragment实现底部tab切换 Android学习笔记:TabHost 和 FragmentTabHost