美文网首页安卓ActivityAndroid知识Android开发
Android四大组件之Activity(五)

Android四大组件之Activity(五)

作者: 程序员丶星霖 | 来源:发表于2017-03-15 21:57 被阅读34次

Android四大组件之Activity(五)

Activity的相关知识也快介绍的差不多了,来认识一下Fragment(官方称之为“片段”)吧。

Fragment简介

  • Fragment是Android3.0引入的API。它代表了Activity的子模块,因此可以把Fragment理解成为Activity片段。Fragment有自己的生命周期,也可以接受自己的输入事件,并且我们可以在Activity运行的时候添加或移除片段。
  • Fragment表示Activity中的行为或用户界面部分。我们可以将多个Fragment组合在一个Activity中来构建多窗格UI,以及在多个Activity中重复使用某个片段。
  • Fragment必须始终嵌入在Activity中,其生命周期直接受主Activity生命周期的影响。
关于Fragment,可以归纳一下几个特征:
  • Fragment总是作为Activity界面的组成部分。Fragment可调用getActivity()方法获取它所在的Activity,Activity可调用FragmentManager的findFragmentById()或findFragmentByTag()方法来获取Fragment。
  • 在Activity运行过程中,可调用FragmentManager的add()、remove()、replace()方法动态地添加、删除或替换Fragment。
  • 一个Activity可以同时组合多个Fragment;反之,一个Fragment也可以被多个Activity复用。
  • Fragment可以响应自己的输入事件,并拥有自己的生命周期,但它们的生命周期直接被其所属的Activity的生命周期控制。

Fragment的设计初衷

Android3.0引入Fragment的初衷是为了适应大屏幕的平板电脑,由于平板电脑的屏幕比手机屏幕更大,因此可以容纳更多的UI组件,且这些UI组件之间存在交互关系。利用Fragment实现此类设计时,我们无需管理对视图层次结构的复杂更改。
Fragment简化了大屏幕UI的设计,它不需要开发者管理组件包含关系的复杂变化,开发者使用Fragment对UI组件进行分组、模块化管理,就可以更方便地在运行过程中动态更新Activity的用户界面。

如下图所示:
31501.png

如何创建一个Fragment?

与创建Activity类似,在创建Fragment时必须继承Fragment的基类。
通常来说,创建一个Fragment需要实现以下三个方法:

  • onCreate():系统创建Fragment对象后回调该方法,在实现代码中只初始化想要在Fragment中保持的必要组件,当Fragment被暂停或者停止后可以恢复;
  • onCreateView():当Fragment绘制界面组件时会回调该方法。该方法必须返回一个View,该View也就是该Fragment所显示的View。
  • onPause():当用户离开该Fragment时将会回调该方法。
    下面是创建一个Fragment的简单示例:
public class NoneLeftMenuFragment extends Fragment {

    private View inflate;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        inflate = inflater.inflate(R.layout.fragment_none_leftmenu, container, false);
        return inflate;
    }
}

inflate()方法有三个参数:

  • 要扩展的布局的资源ID;
  • 将作为扩展布局父项的ViewGroup。传递container对系统向扩展布局的根视图应用布局参数具有重要意义;
  • 指示是否应该在扩展期间将扩展布局附加至ViewGroup的布尔值。

Fragment与Activity通信

为了在Activity中显示Fragment,还必须将Fragment添加到Activity中。将Fragment添加到Activity中有下面两种方法:

  1. 在Activity的布局文件内声明Fragment;
    在布局文件中使用<fragment.../>元素添加Fragment,<fragment.../>元素的android:name属性指定Fragment的实现类。
<fragment
    android:id="@+id/none_fragment"
    android:name="com.tengxin.chelingwang.ui.fragment.NoneLeftMenuFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</fragment>
  1. 通过编程方式将片段添加到某个现有ViewGroup
    在Java代码中通过FragmentTrasaction对象的add()方法来添加Fragment。
    在布局文件中使用<FrameLayout.../>添加布局,用于之后的内容替换;
    Activity的getFragmentManager()方法可返回FragmentManager,FragmentManager对象的beginTransaction()方法即可开启并返回FragmentTransaction对象。
<FrameLayout
    android:id="@+id/fl_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</FrameLayout>
private void initView() {
    noneLeftMenuFragment = new NoneLeftMenuFragment();
    fragmentManager = getSupportFragmentManager();
    transaction = fragmentManager.beginTransaction();
    replace = transaction.replace(R.id.fl_container, noneLeftMenuFragment);
    replace.commit();
}

将Fragment添加到Activity之后,Fragment必须与Activity交互信息,这就需要Fragment能够获取它所在的Activity,Activity也能获取它所包含的任意的Fragment。可以按照下面的方法获取:

  • Fragment获取它所在的Activity:调用Fragment的getActivity()方法即可返回它所在的Activity;
  • Activity获取它包含的Fragment:调用Activity关联的FragmentManager的findFragmentById(int id)或findFragmentByTag(String tag)方法即可获取指定的Fragment。

Fragment与Activity相互传递数据可按下面的方式进行:

  • Activity向Fragment传递数据:在Activity中创建Bundle数据包,并调用Fragment的setArguments(Bundle bundle)方法即可将Bundle数据包传给Fragment;
  • Fragment向Activity传递数据或Activity需要在Fragment运行中进行实时通信:在Fragment中定义一个内部回调接口,再让包含该Fragment的Activity实现该回调接口,这样Fragment即可调用该回调方法将数据传给Activity。

Fragment管理与Fragment事物

Activity管理Fragment主要依靠FragmentManager,FragmentManager可以完成如下几方面的功能:

  • 通过findFragmentById()或findFragmentByTag()获取Activity中存在的片段;
  • 通过popBackStack()将Fragment从返回栈中弹出;
  • 通过addOnBackStackChangedListener()注册一个侦听返回栈变化的侦听器。

在Activity中使用Fragment可以根据用户行为通过它们执行添加、移除、替换以及其他操作。我们提交给Activity的魅族更改都被称之为事务,可以使用FragmentTransaction中的API来执行一项事务。
向FragmentTransaction添加更改的顺序无关紧要,不过:

  • 您必须最后调用commit();
  • 如果您要向同一个容器添加多个片段,则您添加片段的顺序将决定它们在视图层次结构中的出现顺序。

Fragment的生命周期

与Activity类似,Fragment也存在如下状态:

  • 运行状态:当前Fragment位于前台,用户可见,可以获取焦点;
  • 暂停状态:其他Activity位于前台,该Fragment依然可见,只是不能获取焦点;
  • 停止状态:该Fragment不可见,失去焦点;
  • 销毁状态:该Fragment被完全删除,或该Fragment所在的Activity被结束。
    下图是Fragment的生命周期的图示:
31502.png
在Fragment的生命周期中,下面的方法会被系统所回调:
  • onAttach():当该Fragment被添加到Activity时被回调。该方法只会被回调一次;
  • onCreate(Bundle savedStatus):创建Fragment时被回调。该方法只会被调用一次;
  • onCreateView():每次创建、绘制该Fragment的View组件时回调该方法,Fragment将会显示该方法返回的View组件;
  • onActivityCreated():当Fragment所在的Activity被启动完成后回调该方法;
  • onStart():启动Fragment时被回调;
  • onResume():恢复Fragment时被回调,在onStart()方法后一定会调用onResume()方法;
  • onPause():暂停Fragment时被回调;
  • onStop():停止Fragment时被回调;
  • onDestroyView():销毁该Fragment所包含的View组件时调用;
  • onDestroy():销毁Fragment时被回调。该方法只会被调用一次;
  • onDetach():将该Fragment从Activity中删除、替换完成时回调该方法,在onDestroy()方法后一定会回调onDetach()方法。该方法只会被调用一次。
好的,今天就到这吧。只是简单的介绍一下Fragment,欢迎大家关注我的微信公众号!
qrcode_for_gh_ca0387b084e8_344.jpg

相关文章

网友评论

    本文标题:Android四大组件之Activity(五)

    本文链接:https://www.haomeiwen.com/subject/zxzlnttx.html