Android fragment与activity区别

2022-05-28  本文已影响0人  懵懵懂懂_YOYO

activity是四大组件之一,但是fragment主要为了适配平板等设备,在Android3.0之后出现的。

1.灵活性

fragment是依附于activity存在的,可以通过getActivity()方法获取当前的activity,即宿主activity。可以直接在XML文件中添加<fragment/>,Activity则不能。

<fragment
Android:id="@+id/test_fragment1"
Android:name="com.example.fragmenttest.TestFragment1"/>

2.生命周期

Activity有7个生命周期:onCreate()---> onStart()--->onResume() --->onPause() --->onStop() --->onDestroy() --->onRestart();

Fragment有11个生命周期:onAttach() --->onCreate() --->onCreateView() --->onActivityCreate() --->onStart() --->onResume() --->onPause() --->onStop() --->onDestroyView() --->onDestroy() --->onDetach();

所以Fragment比较与Activity来说会更加灵活,因为生命周期多了,你可以控制的地方也就多了。


image.png

其中
onAttach()
作用:fragment已经关联到activity,这个时候 activity已经传进来了, 获得activity的传递的值 就可以进行 与activity的通信里, 当然也可以使用getActivity(),前提是这个fragment已经和宿主的activity关联,并且没有脱离,有且只有调用一次。
onCreate()
系统创建fragment的时候回调他,在他里面实例化一些变量,这些个变量主要是:当你暂停、停止的时候 你想保持的数据、他只调用一次。
onCreateView()
第一次使用的时候 fragment会在这上面画一个layout出来, 为了可以画控件 要返回一个 布局的view,也可以返回null j 就什么都没有显示。
当系统用到fragment的时候 fragment就要返回他的view,越快越好 ,所以尽量在这里不要做耗时操作,比如从数据库加载大量数据
onActivityCreated()
当Activity中的onCreate方法执行完后调用。当执行onActivityCreated()的时候 activity的onCreate才刚完成。所以在onActivityCreated()调用之前activity的onCreate可能还没有完成,所以不能再onCreateView()中进行与activity有交互的UI操作,UI交互操作可以在onActivityCreated()里面进行。所以呢,这个方法主要是初始化那些你需要你的父Activity或者Fragment的UI已经被完整初始化才能初始化的元素。
onStart()
和activity一致,启动Fragement 启动时回调,,此时Fragement可见。
onResume()
和activity一致 在activity中运行是可见的。激活, Fragement 进入前台, 可获取焦点时激活。
onPause()
和activity一致 其他的activity获得焦点,这个仍然可见第一次调用的时候,指的是 用户 离开这个fragment(并不是被销毁)
通常用于 用户的提交(可能用户离开后不会回来了)
onStop()
和activity一致, fragment不可见的, 可能情况:activity被stopped了或者 fragment被移除但被,加入到回退栈中,一个stopped的fragment仍然是活着的如果长时间不用也会被移除。
onDestroyView()
Fragment中的布局被移除时调用。表示fragemnt销毁相关联的UI布局, 清除所有跟视图相关的资源。然后这个知识移除视图 并没有销毁而且还没有脱离activity
onDestroy()
销毁fragment对象, 跟activity类似了。
onDetach()
Fragment和Activity解除关联的时候调用。 脱离activity。

3.可以在一个界面上灵活的替换一部分页面,Activity不可以,做不到,activity 只能进行跳转切换.

4.fragment和Activity之间的通信:(也就是控件的相互操控)

fragment控制fragment:得到一个Activity,然后通过这个Activity的getFragmentManager()获得该Fragment的实例。

fragment控制Activity:这个很简单。每个Fragment都有getActivity()得到一个活动。MainActivity activity=getActivity();

Activity控制fragment:xxxFragment xxx=getFragmentManager().findFragmentById();

Activity控制Activity:这个显然是通过Intent活动之间的通信完成。

5.fragment和Activity中控件的加载

Fragment的载入是通过OnCreateView的时候通过inflater.inflate()加载布局
Activity的载入是通过OnCreate的时候通过setContentView()加载布局

6.动态加载不同的fragment

FragmentManager fragmentManager = getSupportFragmentManager();
List<Fragment> fragments new ArrayList<>();
xxxFragment  fragment = new xxxFragment ();
fragments.add(fragment );
hideOthersFragment(fragment , true);
 
…………………………
    @Override
    public void onItemClick(int position) {
        switch (position) {
            case 0:
               hideOthersFragment(fragment, false);
                break;
            case 1:
                if (xxxFragment2 == null) {
                       xxxFragment2 fragment2  = new xxxFragment2();
                       fragments.add(fragment2);
                        hideOthersFragment(fragment2, true);
                   } else {
                       hideOthersFragment(fragment2, false);
                   }
                break;
            case 2:
                if (xxxFragment3 == null) {
                       xxxFragment3 fragment3  = new xxxFragment3();
                       fragments.add(fragment3);
                        hideOthersFragment(fragment3, true);
                   } else {
                       hideOthersFragment(fragment3, false);
                   }
                break;
            
 
        }
    }
 
/**
     * 动态显示Fragment
     *
     * @param showFragment 要增加的fragment
     * @param add          true:增加fragment;false:切换fragment
     */
    private void hideOthersFragment(Fragment showFragment, boolean add) {
        transition = fragmentManager.beginTransaction();
        if (add)
            transition.add(R.id.main_container_content, showFragment);
        for (Fragment fragment : fragments) {
            if (showFragment.equals(fragment)) {
                transition.show(fragment);
            } else {
                transition.hide(fragment);
            }
        }
        transition.commit();
    }

参考:https://blog.csdn.net/sinat_28864443/article/details/97148265

上一篇 下一篇

猜你喜欢

热点阅读