Android56net亚洲必赢 Fragment基本使用

来源:未知作者:编程 日期:2020/03/02 06:06 浏览:

自打谷歌(Google卡塔尔(قطر‎在Android3.0临盆Fragment未来,Fragment就改为了绝大大多应用程式的必不可缺因素,其利害攸关拉合尔某个也不亚于四大组件。从字面上来看,Fragment的意味是心碎,Google的本目的在于于将贰个Activity的界面实行碎片化,好让开垦者依据不一致的显示器来举行差异的Fragment组合以来达到动态布局的效果。但从当前的动静来看,因为Android平板Computer的市镇分占的额数偏低,繁多行使都未对机械进行单独适配,即便有适配的APP也是独自维护叁个机械的档期的顺序与手机项目分离开来进展UI的编辑与适配。不过那并不曾影响到左近开采者对Fragment的挚爱,因为fragment作为二个UI分界面包车型客车载体,它的使用上非常心闲手敏。相同的时候更珍视的一点是,同样完毕一个界面,Fragment相对于Activity来讲越发省里部存款和储蓄器,能够说它是一个越来越轻量级的分界面载体。假如说我们的施用里有98个分界面,假使全用Activity来张开落实的话,那么任何应用跑起来然后内部存款和储蓄器的损耗是大幅的,而就算接受Activity+Fragment的贯彻际景况势,则可大大收缩内部存款和储蓄器的消耗。所以Fragment在Android开垦者此中是那三个收迎接的,不过应接归招待,Fragment中的各样坑也是另自身在前期开采之时胃疼不已。所以随着上三遍对Activity的总计,那一遍重大对Fragment一些底蕴知识举行部分总计和总结。注:以下的装有深入分析均不思忖向Android4.0以下匹配。

目录

56net亚洲必赢 1

Fragment.png

Fragment意味着 Activity中的行为或客商分界面部分。您能够将五个部分组合在三个 Activity 中来营造多窗格 UI,以致在多少个 Activity 中重复使用有些片段。您能够将有个别视为 Activity 的模块化组成都部队分,它富有友好的生命周期,能接收自身的输入事件,何况您可以在 Activity 运营时加多或移除片段(有一些像您能够在不一致 Activity 中重复使用的“子 Activity”)。

这种办法是运用Fragment的最简易的一种方法了,大家只须要声美赞臣个类世袭自Fragment完成其onCreateView方法,并将fragment申明在Activity的xml里就能够。大家来看代码:AFragment.java:

一.Fragment详解

一对必须一贯置于在 Activity 中,其生命周时期采用宿主 Activity 生命周期的熏陶。 比如,当 Activity 暂停时,当中的全体片段也会搁浅;当 Activity 被销毁时,全体片段也会被死灭。 然则,当 Activity 正在运营(处于已恢复生命周期状态)时,您能够独立操纵每一个片段,如增多或移除它们。 当您实践此类片段事务时,您也能够将其增加到由 Activity 管理的回来栈 — Activity 中的每一种再次来到栈条约都以一条已发出局地事务的笔录。 再次来到栈让客商能够因此按返回开关打消片段事务(后退)。

@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.afragment, container, false);}

一.Fragment基础

当您将一些作为 Activity 架构的一局部加多时,它存在于 Activity 视图档案的次序构造的有些ViewGroup内部,並且有的会定义其协和的视图构造。您能够透过在 Activity 的布局文件中宣示片段,将其视作 <fragment> 成分插入您的 Activity 布局中,只怕经过将其增加到某些现存ViewGroup,利用应用代码举办扦插。但是,片段并不是必得成为 Activity 结构的一部分;您还是能够将未有和谐 UI 的部分用作 Activity 的不可以见到职业线程。

afragment.xml:

1.Fragment

Fragment为何会见世,它其实是android3.0的时候引进的,能够翻译为“碎片” “片段”初步它主如果给大荧屏上配备上越来越灵敏的显示UI所设计的。

56net亚洲必赢 2

图形来源互连网.png

如上海体育场合,左边表现的是猛烈Computer上的选用意况,而在实际项目耗费中,使用频率更加高的是左侧的气象,侧面的图中,左右八个Activity满含了个其他Fragment,Activity A通过 方法运行 Activity B时,实际上运维的是Fragment B。所以说咱俩常常会在三个Activity中嵌套多少个Fragment,来实行UI 数组间的切换,日常用到的格局是Fragment+ViewPager。 Fragment比较Activity 更节省里部存款和储蓄器,同期UI的切换效果尤其酣畅, Fragment有谈得来的生命周期,同一时间它能够动态,灵活的加载Activity。不过Fragment实际不是像Activity相似完全部独用立的,它纵然有友好的生命周期,但它必得依赖Activity,同期它要加载到Activity当中。


<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:andro android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="AFragment" /></RelativeLayout>
2.Fragment加载到Activity的两种艺术

1.静态增加:增多Fragment到Activity的布局文件个中
2.动态拉长:动态在Activity中增多Fragment

静态加载正是把Fragment作为二个xml的标签加到Activity结构当中。

常用的情势正是动态增加
率先在布局文件中放三个FrameLayout,方便在Activity中能够动态拉长差异的Fragment

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.bsoft.fragmentdemo.MainActivity">
    <FrameLayout
        android:id="@+id/fl_demo"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</RelativeLayout>

下一场在Activity中动态加多Fragment

    //步骤1 : 添加FragmentTransaction的实例
    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction transaction = fragmentManager.beginTransaction();

    //步骤2 :用add()方法加上Fragment的对象FirstFragment
     FirstFragment firstFragment = new FirstFragment();
     transaction.add(R.id.fl_demo,firstFragment);

     //步骤3 : 调用commit()方法使FragmentTransaction实例的改变生效。
     transaction.commit();

1. 为啥说Fragment被叫作是第中国共产党第五次全国代表大会组件

Android 在 Android 3.0(API 等级11)中引入了有的,首倘若为着给大荧屏(如平板计算机)上特别动态和灵活的 UI 设计提供支撑。由于机械Computer的显示屏比手提式有线电话机显示器大得多,因而可用于组合和置换 UI 组件的空间更加大。利用部分完成此类设计时,您没有供给治本对视图档案的次序布局的复杂性改进。 通过将 Activity 结构分成片段,您能够在运营时改进 Activity 的外观,并在由 Activity 处理的回来栈中保留那个改造。

Fragment的行使为Android开荒推动了质的高效,消除了碎片化的主题材料,在不相同显示屏尺寸和分辨率上都能有合理的显得,超级大地进步了客户的经历。

activity_main.xml:

3.FragmentPagerAdapter与FragmentStatePagerAdapter区别

FragmentPagerAdapter适用于页面非常少的景况。
FragmentStatePagerAdapter适用于页面比较多的情事。

FragmentPagerAdapter源码中的destroyItem方法:

   @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        if (mCurTransaction == null) {
            mCurTransaction = mFragmentManager.beginTransaction();
        }
        if (DEBUG) Log.v(TAG, "Detaching item #" + getItemId(position) + ": f=" + object
                + " v=" + ((Fragment)object).getView());
        mCurTransaction.detach((Fragment)object);
    }

它聊起底一行调用的是 FragmentTransaction的detach方法。detach并不是实在的内部存款和储蓄器回笼,它只是把Fragment的UI和Activity的UI脱离开来,并不回笼内部存款和储蓄器。

FragmentStatePagerAdapter源码中的destroyItem方法:

 @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        Fragment fragment = (Fragment) object;

        if (mCurTransaction == null) {
            mCurTransaction = mFragmentManager.beginTransaction();
        }
        if (DEBUG) Log.v(TAG, "Removing item #" + position + ": f=" + object
                + " v=" + ((Fragment)object).getView());
        while (mSavedState.size() <= position) {
            mSavedState.add(null);
        }
        mSavedState.set(position, fragment.isAdded()
                ? mFragmentManager.saveFragmentInstanceState(fragment) : null);

        mFragments.set(position, null);
        //在这里
        mCurTransaction.remove(fragment);
    }

mCurTransaction.remove(fragment卡塔尔国,在FragmentStatePagerAdapter里面是确实自由了fragment内部存款和储蓄器。所以表明了FragmentStatePagerAdapter比FragmentPagerAdapter更节本省部存款和储蓄器的。

2. Fragment生命周期

56net亚洲必赢 3

fragment_lifecycle

为越来越好的知情,结合Activity,如下图:

56net亚洲必赢 4

转自慕课网

56net亚洲必赢 5

  1. 在Fragment中调用Activity中的方法getActivity();
  2. 在Activity中调用Fragment中的方法接口回掉
  3. 在Fragment中调用Fragment中的方法findFragmentById()
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:andro xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.xn.myproject.MainActivity"> <fragment android: android:name="com.xn.myproject.fragment.AFragment" android:layout_width="match_parent" android:layout_height="match_parent" /></LinearLayout>

二.Fragment生命周期

56net亚洲必赢 6

图表来源网络.png

3. Fragment加载到Activity中的方法:

最首要有三种方法:静态加载&动态加载

  1. 静态加载:增多Fragment到Activity的布局文件中;
  2. 动态加载:
  1. 加上二个FragmentTransaction实例;
  2. add()方式加上Fragment的对象;
  3. 调用commit()办法使得FragmentTransaction实例的变动生效。

56net亚洲必赢 7AFragment呈现效果.png

1.Fragment生命周期与Activity生命周期的对照

56net亚洲必赢 8

图形来源于互联网.png

4.FragmentPagerAdapter与FragmentStatePagerAdapter的区别

FragmentPagerAdapter:保存全体插手的fragment,纵然大幅度超越1的页面会调用destroyItem,可是在fragment的生命周期里,唯有onDestroyView调用了,未有调用onDestory,也绝非调用onDetach,所以fragment只是把地点的view销毁了,fragment并不曾灭绝,下一次再创制的时候,只会调用onCreateView和onActivityCreated,所以FragmentPagerAdapter里全体fragment都未曾消亡,那样占用内部存储器大,同期制止了频仍的灭绝和创办,适用于页面少之甚少的情状。

FragmentStatePagerAdapter:对步长以内的fragment,跟FragmentPagerAdapter同样,不会调用任何销毁操作,再度突显也不须要另行成立,对步长以外的fragment会调用destroyItem,跟FragmentPagerAdapter不相像,会真正销毁(同一时间灭绝view和fragment,调用onDestroyView以致其背后的兼具销毁方法),重新建立时会在这里早前期的onAttach初叶一贯到onActivityCreated,适用于页面比非常多的情况。

  • 当page数量少,用FragmentPagerAdapter;
  • 反之则用FragmentStatePagerAdapter;
  • 它们两的Fragment生命周期在ViewPage的切换进程中都会再也实施数次,所以它都不适用于App主页Tab。

像这种类型我们就将AFragment作为一个控件彰显出来了,十分简易,只是供给当心fragment控件必定要加id属性就能够,不然会崩溃。。可是将Fragment作为二个控件来选拔相对化是杀鸡用牛刀的做法,不值得一说倡,所以在这里地也不对它做过多的剖析了。

2.Fragment从运行到销毁生命周期全经过

56net亚洲必赢 9

Fragment从起步到销毁生命周期全进度.png

跟回想Activity生命周期同样,Fragment的生命周期也亟需灵活的来回想

Fragment 创制时会调用:

onAttach() -> onCreate() -> onCreateView() -> onActivityCreated()

onAttach():在Fragment 与 Activity关联之后所回调的
onCreate() : 是在初次创制Fragment时候调用
注:这里的onCreate方法看起来和Activity中的onCreate方法一致。可是这些方式只是用来创建Fragment,那个时候的Activity还并从未被创制完毕。
onCreateView():是系统在Fragment第二遍绘制客商分界面时候调用的那个措施
注:假诺想要为这么些Fragment绘制UI分界面,从该方法重返的View必得是Fragment布局的根视图。
在onCreateView(卡塔尔(قطر‎方法调用之后会调用onViewCreated(卡塔尔方法
Android56net亚洲必赢 Fragment基本使用。onViewCreated():申明Fragment的UI分界面已经完全绘制好了,调用那几个方法能够初始化控件能源。
onActivityCreated():这些主意是在Activity的onCreat(卡塔尔国方法调用之后才得以被调用。也正是在Activity被渲染绘制成功现在的调用方法

Fragment被顾客可以知道后调用
onStart() -> onResume()

onStart():表示Fragment可见了
onResume():意味着Fragment能够跟顾客举行相互了(点击,滑动等操作)

到这里已经做到了Fragment从运维到表现的操作。

当要Fragment被销毁
onPause() -> onStop() -> onDestroyView() -> onDestroy() -> onDetach()

onPause():系统将此措施作为客商间距Fragment的第三个时域信号(但并不总是意味着此Fragment会被消亡)举办调用。 平常能够在这里办法内肯定在日前客户会话截止后仍然有效的其他变动(因为客商大概不会回到)。
onDestroyView():表示这些Fragment将要收尾,会被封存。
onDetach():Fragment和Activity清除关系的时候调用

到此,大家完全的走完一Fragment的生命周期。

5. 片段措施

重点的操作都是FragmentTransaction的章程:
FragmentTransaction transaction = fm.benginTransatcion();//开启一个事务

  • transaction.add(卡塔尔国 :往Activity中增加三个Fragment;
  • transaction.remove(State of Qatar:从Activity中移除二个Fragment,假设被移除的Fragment未有增进到回落栈,这一个Fragment实例将会被销毁;
  • transaction.replace(卡塔尔:使用另三个Fragment替换当前的,实际上便是remove(卡塔尔然后add(State of Qatar的合体;
  • transaction.hide(卡塔尔:隐瞒当前的Fragment,仅仅是设为不可以知道,并不会销毁
  • transaction.show(卡塔尔(قطر‎:突显在此之前隐敝的Fragment
  • detach(State of Qatar:会将view从UI中移除,和remove(卡塔尔(قطر‎不一致,此时fragment的情事依然由FragmentManager维护。
  • attach(卡塔尔:重新营造view视图,附加到UI上并展现。
  • transatcion.commit(State of Qatar:提交多个专业

在代码中经过FragmentManager获取FragmentTransaction来开展Fragment的动态增加才是大家最常用的运用格局。先来看代码:MainActivity:

还应该有局地其余场景时Fragment调用的生命周期

显示屏灭掉
onPause() -> onSaveInstanceState() -> onStop()

显示屏解锁
onStart() -> onResume()

切换到此外Fragment
56net亚洲必赢 ,onPause() -> onStop() -> onDestroyView()

切换回自家的Fragment
onCreateView() -> onActivityCreated() -> onStart() -> onResume()

重回桌面
onPause() -> onSaveInstanceState() -> onStop()

回来应用
onStart() -> onResume()

参考、感谢:

  1. 片段
  2. Android Fragment 真正的通通解析(上)
  3. Android -- Fragment 基本用法、生命周期与细节注意
  4. 论FragmentPagerAdapter与FragmentStatePagerAdapter的界别与使用处境
 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mAFragment = new AFragment(); getFragmentManager().beginTransaction() .replace(R.id.main_container, mAFragment).commit(); getFragmentManager().beginTransaction().show(mAFragment); }

三.Fragment通信

activity_main.xml:

1.在Fragment中调用Activity中的方法

(getActivity)假如调用getActivity方法,就能够取获得Activity中的方法

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:andro xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.xn.myproject.MainActivity"> <FrameLayout android: android:layout_width="match_parent" android:layout_height="match_parent" /></LinearLayout>
2.在Activity中调用Fragment中的方法

(接口回调)在Fragment中开创个接口,然后由Activity实现。那样就能够成就在Activity中调用Fragment中的方法

  • 上一篇:没有了
  • 下一篇:没有了