fragment与activity。什么时候使用?

Fragment与Activity。什么时候用什么时候不用?

回答: 看需求!

个人觉得推荐场景

(使用Fragment完全替换Activity,而Activity用来管理Fragment或者把fragment当作一个轻量级activity使用)

  • 当你一个Activity需要模块化的时候,你可以单独写一个Fragment并且嵌套在任何一个界面,不用担心重复代码。

  • 一般主页的每个tab都是用Fragment,类似的一个页面下有多个布局需要切换的时候感觉用Fragment很方便

  • 布局在不同的设备上比如手机和平板上的适配

  • 比如 App 中有一个新用户注册功能,包括设置用户名、密码、手机号等等流程,设计师在 UI 设计上将每个流程单独设计成一个界面,引导用户一步步操作。作为开发人员,如果将每一个完善信息的流程单独设置成一个 Activity 的话操作起来就比较繁琐,并且也不易于应用里的逻辑处理,而如果使用 Fragment 并结合回退栈的话,就非常合适了


    FragmentManager fm = getSupportFragmentManager();

    FragmentTransaction ft = fm.beginTransaction();

    ft.hide(firstStepFragment);

    if (secondStepFragment==null){

        ft.add(R.id.fl_content, secondStepFragment);

    }else {

        ft.show(secondStepFragment);

    }

    ft.addToBackStack(null);

    ft.commit();


注意:这里使用了 hide() 方法,而不是 replace() 方法,因为我们当然希望用户返回上一步操作时,之前设置的内容不会消失。

Activity管理Fragment的思路:(曾经用过)
  • 当然别忘了FragmentManager。管理着 正在activity里显示的fragment们(用list)以及detach之后跟view hiearchy断开联系的被放进backstack的fragment:

  • 建一个hashmap,用于存放已实例过的fragment,要复用的时候直接拿出来,而且还可以解决Fragment 重叠问题;

  • 写一个Basefragment,子Fragment继承与它,自定义接口,在activity里实现接口方法,因此activity可以根据待实例化fragment的属性进行管理控制。(这也是观察着模式)

    具体实现方式如下:

   public class BaseFragment extends Fragment implements View.OnClickListener{

       public interface IOneFragmentClickListener{

           void onOneFragmentClick();

       }

       @Nullable

       @Override

       public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

           View contentView = inflater.inflate(R.layout.fragment_one, null);

           contentView.findViewById(R.id.edt_one).setOnClickListener(this);

           return contentView;

       }

       @Override

       public void onClick(View v) {

           if (getActivity() instanceof IOneFragmentClickListener){

                ((IOneFragmentClickListener) getActivity()).onOneFragmentClick();

           }

       }

   }

只要在宿主 Activity 实现 Fragment 定义的对外接口 IOneFragmentClickListener,便可以实现 Fragment 调用 Activity 的功能。

fragment的使用

作为 Activity 界面的一部分,Fragment 的存在必须依附于 Activity,并且与 Activity 一样,拥有自己的生命周期,同时处理用户的交互动作。同一个 Activity 可以有一个或多个 Fragment 作为界面内容,并且可以动态添加、删除 Fragment,灵活控制 UI 内容,也可以用来解决部分屏幕适配问题。
另外,support v4 包中也提供了 Fragment,兼容 Android 3.0 之前的系统(当然,现在 3.0 之前的系统在市场上已经很少见了,可以不予考虑),使用兼容包需要注意两点:

  • Activity 必须继承自 FragmentActivity;

  • 使用 getSupportFragmentManager() 方法获取 FragmentManager 对象;

fragment 生命周期:

一边看一边提出一些问题:

  • attach跟add怎么理解?inflate呢?
  • attach有什么作用?有什么好处,因此适合什么场景?
image

个人对提出问题的回复:

Applications should generally not implement a constructor. Prefer
{@link #onAttach(Context)} instead. It is the first place application code can run where
the fragment is ready to be used - the point where the fragment is actually associated with its context. Some applications may also want to implement {@link #onInflate} to retrieve
attributes from a layout resource, although note this happens when the fragment is attached.</pre>

  • attach:将fragment与Activirty联系起来,通过context。所以通过fragment startActiviotyForResult 其实也是Activity start的,回调onActivityResult() 也是应该由activity处理。 </pre>
  • add:将fragment加到ViewHiearchy中,通过把fragment加到manager管理的active的fragment的List里。
  • onInflate():保存布局里的属性

Called when a fragment is being created as part of a view layout
inflation, typically from setting the content view of an activity. This may be called immediately after the fragment is created from a <fragment>
tag in a layout file. Note this is <em>before</em> the fragment's
{@link
#onAttach(Activity)} has been called; all you should do here is
parse the attributes and save them away. <p>This is called every time the fragment is inflated, even if it is
being inflated into a new instance with saved state. It typically makes sense to re-parse the parameters each time, to allow them to change with different configurations.</p> </pre>

attach与detach及回退栈的配合,如果当你detach fragment时,那么被移除的fragment就被停止了(没有消亡,但视图已经销毁了),如果用户导航回来重新加载这个fragment,它将会重新启动,视图也会重新创建,如果你没有把事务加入到堆栈中,当fragment被remove时,这个fragment也就消亡了。

通信方式


通常,Fragment 与 Activity 通信存在三种情形:

  • Activity 操作内嵌的 Fragment

    由于 Activity 持有所有内嵌的 Fragment 对象实例(创建实例时保存的 Fragment 对象,或者通过 FragmentManager 类提 供的 findFragmentById() 和 findFragmentByTag() 方法也能获取到 Fragment 对象),所以可以直接操作 Fragment;

  • Fragment 操作宿主 Activity;
    Fragment 通过 getActivity() 方法可以获取到宿主 Activity 对象(强制转换类型即可),进而可以操作宿主 Activity;那么很自然的,获取到宿主 Activity 对象的 Fragment 便可以操作其他 Fragment 对象。

  • Fragment 操作同属 Activity中的其他 Fragment。
    高内聚,低耦合。Fragment 做好自己的事情即可,所有涉及到 Fragment 之间的控制显示等操作,都应交由宿主 Activity来统一管理。

流行的tab栏结构可以为:
image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,283评论 0 10
  • 早起,下楼到小区看书45分钟,可以听到鸟儿渣渣叫,雨后空气很好 今天晚上的月亮特别圆,很美,准备回家上单反,然后给...
    Jane小白917阅读 301评论 4 1
  • 这几天手机很奇怪,频频出问题,动不动就死机,喜马拉雅听一半儿就卡,下不了东西,微信联系人全部消失..... 首...
    猫公主喵阅读 122评论 0 0
  • “不要啊!”秦子路大喊着从床上挣扎着坐起来。月光从床前半开的窗户闯入这个小房间,停在了被褥上。他右手正摸着心口,刚...
    不知道怎么取名字耶阅读 173评论 1 0
  • 相思如雨 我在小城牵马留下了细细的马蹄 相思如雨 我在阁楼挑灯轻舞了我的瘦笔 相思如雨 我在城墙吹响了我那朱红长笛...
    诗的故事阅读 354评论 1 2