fragment入门

Android Fragment 教程

1 Fragment是什么?

Frament也叫碎片,片段。是Google在Android 3.0引入的,主要为了给大屏幕的UI提供支持的。 Frament可以理解为一个迷你的Activity或者是Activity的模块化的组件,它有自己的生命周期与显示界面,我们可以利用多个Frament嵌套在Activity达到以下的功能,如适配平板,或适配横竖屏幕,或者在程序运行的过程中动态的更改我们的UI界面。如下图:fragments 上图是显示应用运行在手机情况下,从一个列表页面跳转到详细页面的例子。如果我们不使用Fragment的情况,当应用运行在平板上面的情况,就只能显示放大版的手机显示的界面,为了利用平板的特性,Android在3.0版本中提供了Fragment技术,我们就可以将列表与内容以组件的方式插入,在手机上分屏显示两个内容,在平板上面就可以左右显示两个内容。

您可以将片段视为 Activity 的模块化组成部分,它具有自己的生命周期,能接收自己的输入事件,并且您可以在 Activity 运行时添加或删除片段(有点像您可以在不同 Activity 中重复使用的“子 Activity”)。

片段必须始终嵌入在 Activity 中,其生命周期直接受宿主 Activity 生命周期的影响。

2 如何使用Fragment

2.1 创建Fragment

如果需要使用Fragment的话,需继承Fragment类,目前有两个Fragment类:

  • android.support.v4.app.Fragment
  • android.app.Fragment

第一种是sdk提供的是3.0以上提供的类,第二是 android support v4 版本提供的向下兼容类,建议使用第二个类。

继承Fragment至少需实现以下方法:

  • onCreateView() 系统会在片段首次绘制其用户界面时调用此方法,并将创建的UI界面返回

2.2 使用Fragment

  • 在 Activity 的布局文件加入 fragment 控件
  • 在代码中通过编程方式将片段添加到某个现有ViewGroup
2.2.1 在布局文件中添加一个Fragment
  <fragment android:name="com.example.news.ArticleListFragment"
        android:id="@+id/list"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="match_parent" />

android:name 属性指定要在布局中实例化的 Fragment 类。注意如果是在xml中声明的Fragment的话,建议给这个Fragment设置id或者tag,以便后期来find查找该Fragment。

2.2.2 使用代码添加一个Fragment到某个现有ViewGroup
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction().add(android.R.id.content, list,"abc").commit();

2.3 传值给Fragment

  • 不要通过写构造方法来传参,因为Android源码中是使用反射调用的无参构造方法,写带参数的构造方法会导致无法进行状态保存,并可能导致代码抛异常。

  • 通过Fragment的方法、或者回调进行传值

  • setArguments getArguments

      Bundle b = new Bundle();
      b.putCharSequence("label", label);
      f.setArguments(b);
    

3 Fragment的生命周期

fragment_lifecycle

创建时的生命周期

  • onAttach:Fragment开始与Activity关联
  • onCreate:系统会在创建片段时调用此方法。您应该在实现内初始化您想在片段暂停或停止后恢复时保留的必需片段组件。
  • onCreateView:系统会在片段首次绘制其用户界面时调用此方法。 要想为您的片段绘制 UI,您从此方法中返回的 View 必须是片段布局的根视图。如果片段未提供 UI,您可以返回 null
  • onActivityCreated:Activity onCreate完成的回调

移除时的生命周期

  • onSaveInstanceState:处理Fragment 需要保存数据的方法。
  • onDestroyView:将Fragment的View试图从UI中移除
  • onDetach:将Fragment与Acitivity取消关联

4 Fragment的操作FragmentTransaction

我们可以使用FragmentTransaction来对Fragment进行操作,如add、replace、attach、detach

4.1 add--将一个Fragment添加到一个页面,可以重复叠加
    FragmentTransaction transaction = fm.beginTransaction();
    transaction.add(R.id.content, fragment, "my");
    transaction.commit(); 

add(int containerViewId, Fragment fragment, String tag)方法中:

  • containerViewId:将Fragment加入的ViewGroup的id
  • fragment:被操作的Fragment
  • tag:被操作的Fragment的标示,我们操作成功后可以使用这个tag找到相应的Fragment
4.2 replace--将容器内的Fragemnt移除后,再进行添加
    FragmentTransaction transaction = fm.beginTransaction();
    transaction.replace(R.id.content, fragment, "my");
    transaction.commit();  

replace(int containerViewId, Fragment fragment, String tag)方法中:

  • containerViewId 将Fragment替换的ViewGroup的id
  • fragment 被操作的Fragment
  • tag 被操作的Fragment的标示,我们操作成功后可以使用这个tag找到相应的Fragment
4.3 detach--将一个Fragment从UI上面解绑
    FragmentManager fm =  getSupportFragmentManager();
    Fragment fragment =  fm.findFragmentByTag("my");
    FragmentTransaction transaction = fm.beginTransaction();
    transaction.detach(fragment);
    transaction.commit();

注意解绑并不是删除,我们还可以通过其他方法把解绑的Fragment重新绑定到UI上面。

4.4 attach--将一个Fragment绑定到UI
    FragmentManager fm =  getSupportFragmentManager();
    Fragment fragment =  fm.findFragmentByTag("my");
    FragmentTransaction transaction = fm.beginTransaction();
    transaction.attach(fragment);
    transaction.commit();
4.5 remove--将一个Fragment从Activity删除
    FragmentManager fm =  getSupportFragmentManager();
    Fragment fragment =  fm.findFragmentByTag("my");
    FragmentTransaction transaction = fm.beginTransaction();
    transaction.remove(fragment);
    transaction.commit();
4.6 Show--显示一个Fragement
    FragmentManager fm =  getSupportFragmentManager();
    Fragment fragment =  fm.findFragmentByTag("my");
    FragmentTransaction transaction = fm.beginTransaction();
    transaction.show(fragment);
    transaction.commit(); 
4.7 hide--隐藏一个Fragment
    FragmentManager fm =  getSupportFragmentManager();
    Fragment fragment =  fm.findFragmentByTag("my");
    FragmentTransaction transaction = fm.beginTransaction();
    transaction.hide(fragment);
    transaction.commit(); 
4.8 commit与commitAllowingStateLoss

Activity在以下的操作下容易引起回收并触发onSaveInstanceState()

  • 按下HOME键

  • 按下电源按键(关闭屏幕显示)时

    • 屏幕方向切换
    • Activity跳转的时候

以上几种情况下不能进行状态的提交,如果提交的话会出现以下错误

java Can not perform this action after onSaveInstanceState

出现这个错误的时候,我们有两个解决方法:

  1. 不在onSaveInstanceState后提交commit
  2. 使用commitAllowingStateLoss

5 Fragment与返回键

默认情况下,Fragment是不会响应返回键的。如果需要做到类似Activity回退到上一个界面这样的效果,必须将FragmentTransaction,加入返回栈。加入回退栈的方法如下:

    FragmentTransaction transaction = fm.beginTransaction();
    transaction.add(R.id.content, fragment, "my"+index);
    transaction.addToBackStack(null);

addToBackStack(String name); name 参数代表这次FragmentTransion的名称,我们可以根据这个名称找到相应的操作,并进行回退动作。也可以传null,代表不记录该次操作的名称。 如果我们将某次操作加入回退栈的话,我们有一下几种方式进行回退:

  • 使用返回键系统自动回退到上一次操作前的状态。
  • 使用popBackStack回退到指定的操作的状态。

其中不同的方法可以做不同事情:

  • popBackStack(),会回退到上一次操作前的状态
  • popBackStack(String name, int flags),会回退到某次name的操作状态,flag为0或POPBACKSTACK_INCLUSIVE时,则代表清除name的状态
  • popBackStack(int id, int flags)会回退某个id的操作状态,id为commit()返回的。

6 Fragment动画

默认情况下Fragment显示和隐藏是不显示动画的,不过FragmentTransaction提供了三种显示的动画的方式

  • setTransition 使用系统提供的默认显示动画
  • setCustomAnimations 使用自定义动画。

setTransition (int transit) 可以使用系统提供的默认动画,可供选择的有:

  • TRANSIT_NONE
  • TRANSITFRAGMENTOPEN
  • TRANSITFRAGMENTCLOSE

setCustomAnimations (int enter, int exit,int popenter,int popexit) 能够使用自定义动画.这四个参数分别代表:

  • enter 设置Fragment进入动画
  • exit 设置Fragment退出动画
  • popenter popback后回滚状态后上一个Fragment的动画
  • popexit popback后回滚状态后当前的Fragment的动画

注意:setCustomAnimations 需要在FragmentTransaction的设置事务之前(如add),就要调用。

7 Fragment间的交互

使用回调的方式,让FragmentActivity充当中间交互的桥梁。

7.1 onSaveInstanceState

Fragment被回收前的回调,我们可以使用Bundle来保存需要缓存的数据

7.2 Fragment交互的例子

Interactive

8 Fragment使用常用例子

8.1 横竖屏显示不同界面
  1. 新建一个类OrientenActivity继承FragmentActivity

  2. 创建两个Fragment分别用于显示列表和内容页面。FirstFragment 与 ContetnFragment

  3. 在OrientenActivity的布局文件activity_orienten.xml中添加FirstFragment。

xml <fragment android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/list" android:name="com.it520.fragment_land_pro.FristFragment" />

  1. 再新建一个文件夹起名叫layout-land,在文件夹中再新建一个同名的activity_orienten.xml的布局文件,把两个Fragment放入布局中。

```xml <fragment android:layoutwidth="0dp" android:layoutheight="matchparent" android:layoutweight="2" android:id="@+id/list" android:name="com.it520.fragmentlandpro.FirstFragment" />

<fragment android:layoutwidth="0dp" android:layoutheight="matchparent" android:layoutweight="3" android:id="@+id/content" android:name="com.it520.fragmentlandpro.ContentFragment" /> ```

  1. 为FirstFragment添加数据,人工的添加50条数据

  2. 为了让Fragment与Activity交互,使用回调OnClickItemListener。

  3. 在Activity中进行处理,当OnClickItemListener被回调时。获取ContetnFragment。如果获取失败,目前Acitivity是在竖屏状态,跳转ContentActivity。

  4. 如果获取成功,手机是横屏状态,传递值给ContentFragment

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值