Activity与Fragment之间跳转场景

1. 概述

在开发过程中,activity与fragment之间互相跳转很常见,这里记录下自己在项目中遇到的二者互相跳转的场景;

2. 具体场景

场景1:AActivity 跳转 另一个BActivity 中其中一个fragment:

如果BActivity中的多个fragment用的框架是 TabPageIndicator+ViewPager 或者 TabLayout+ViewPager等这种结构的,如下图所示:


图片.png

跳转方法如下:

  • 在AActivity中,跳转到OrderListActivity中,OrderListActivity就相当于是 BActivity ,代码如下:
Intent intent = new Intent(this , OrderListActivity.class) ;
// 如果提交的店铺个数是多个,点击叉号跳转 我的 - 待付款fragment列表
// waitPayFlag是一个标识,用于标识跳转到 我的 - 待付款fragment列表
intent.putExtra("waitPayFlag" , "1") ;
startActivity(intent);
finishActivity(PayActivity.this);
  • 在OrderListActivity中,取出waitPayFlag,代码如下:
@Override
public void initView() {

    // 这个 waitPayFlag 就是从 第一个AActivity中跳转过来传递过来的参数
    // 从购物车页面,如果提交的店铺个数是多个,点击叉号跳转 我的 - 待付款fragment列表
    // 取出从PayActivity中购物车的标识waitPayFlag
    String waitPayFlag = getIntent().getStringExtra("waitPayFlag") ;

    indicator = (TabPageIndicator)findViewById(R.id.indicator);
    viewPager = (ViewPager)findViewById(R.id.viewPager);
    BasePagerAdapter adapter = new     BasePagerAdapter(getSupportFragmentManager());
    viewPager.setAdapter(adapter);
    indicator.setViewPager(viewPager);
    setTabPagerIndicator();

    // TODO:  这里一定要注意:获取waitPayFlag千万不要写到 onResume()中,就写到 initView()中就可以,
    // 我一开始就写到 onResume()中,然后设置viewPager.setCurrentItem(1),界面可以出来,但是就是
    // 不能加载数据

    // 第一:获取waitPayFlag一定要在initView()方法中,不要写到onResume()中;
    // 第二:下边设置viewPager.setCurrentItem(1)这句代码一定要写到 上边viewPager的 findViewById的下边,
    // 否则跳转到的目标fragment显示不出来


    // 从购物车页面,如果提交的店铺个数是多个,点击叉号跳转 我的 - 待付款fragment列表
    // 1表示:用于从PayActivity中点击叉号跳转待付款的fragment
    if(!TextUtils.isEmpty(waitPayFlag)){
          if ("1".equals(waitPayFlag)) {
               // 这里设置要跳转到第几个fragment
               viewPager.setCurrentItem(1);
          }
     }
}
场景2:从任意一个activity或者fragment中 返回到MainActivity中任意一个fragment中
图片.png

有时候在项目中一次性连续跳转了多个Activity,需要点击该Activity的某个按钮执行完操作后,直接返回到 MainActivity 中的 某个fragment中,比如返回到 购物车的 fragment中,方法如下:

可以采用 intent携带参数然后跳转到MainActivity中,然后在 MainActivity中 复写onNewIntent()方法,在这个方法中取出 刚才传递过来的 值,通过这个值来判断 显示对应fragment,代码如下:

比如自己项目是 从首页一直跳转到 VoucherSuccessActivity中,然后点击VoucherSuccessActivity 中的一个完成按钮,直接返回到 首页的 购物车的fragment:

  • VoucherSuccessActivity 代码如下:
// 由于 activity不能直接跳转到 fragment,需要先去跳转到 MainActivity 中,
// 根据在 MainActivity 中显示的方法去显示需要的fragment即可
Intent intent=new Intent(VoucherSuccessActivity.this, MainActivity.class);
intent.putExtra("juanFlag","1");    // 1表示领券成功后 需要跳转到劵包fragment
startActivity(intent);
overridePendingTransition(R.anim.activity_in_from_right,
                R.anim.activity_out_to_left);

AppManager.getAppManager().finishAllActivity();
  • 在 MainActivity 中 复写 onNewIntent()方法,然后取出传递的参数,然后判断:
    /**
     * 在onNewIntent方法中进行的判断,然后显示MainActivity中对应的fragment即可,
     * 只要执行这个方法就不会执行onCreate()方法,
     *
     * 执行顺序如下:
     *      onNewIntent()---->onResart()------>onStart()----->onResume()生命周期就发生了更改
     */
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        String juanFlag = intent.getStringExtra("juanFlag");
        if (!TextUtils.isEmpty(juanFlag)){
            if ("1".equals(juanFlag)) {
                goFragmentIndex();
            }
        }
    }

    /**
     * 用于接收从商品详情 跳转到购物车fragment的id值
     */
    private void goFragmentIndex() {

        // 这里直接给currentIndex角标设置数字,然后调用showFragment()及对应图标和文字切换,
        // 就可以正常从任意界面切换到MainActivity中所在的fragment
        currentIndex = 2;
        showFragment();
        tvMainTab1.setTextColor(getResources().getColor(R.color.driver_name));
        imgMainTab1.setImageResource(R.mipmap.home_1);

        tvMainTab3.setTextColor(getResources().getColor(R.color.driver_name));
        imgMainTab3.setImageResource(R.mipmap.integral_1);

        tvMainTab4.setTextColor(getResources().getColor(R.color.bg_common_color));
        imgMainTab4.setImageResource(R.mipmap.main_juan_checked);

        tvMainTab5.setTextColor(getResources().getColor(R.color.driver_name));
        imgMainTab5.setImageResource(R.mipmap.my_1);
    }

    /**
     * 使用show() hide()切换页面
     * 显示fragment
     */
    private void showFragment(){

        FragmentTransaction transaction = fragmentManager.beginTransaction();

        //如果之前没有添加过
        if(!fragments.get(currentIndex).isAdded()){

            // 第三个参数为添加当前的fragment时绑定一个tag
            transaction
                    .hide(currentFragment)
                    .add(R.id.layout_main_content,fragments.get(currentIndex),""+currentIndex); 

        }else{
            transaction
                    .hide(currentFragment)
                    .show(fragments.get(currentIndex));
        }

        currentFragment = fragments.get(currentIndex);
        transaction.commit();

    }
3. 注意事项

注意上边的2个场景是不同的2个场景:

场景1:采用框架是 TabPageIndicator + ViewPager ,中间切换的多个 ViewPager 用 fragment来 设置;

直接可以通过 传递过来的 flag,然后设置 要显示的 ViewPager 的fragment即可:

if(!TextUtils.isEmpty(waitPayFlag)){
          if ("1".equals(waitPayFlag)) {
               // 这里设置要跳转到第几个fragment
               viewPager.setCurrentItem(1);
          }
     }
场景2:采用的是 FrameLayout(中间布局) + LinearLayout(水平方向 ImageView + TextView),需要用 如下类似方式实现:
    /**
     * 使用show() hide()切换页面
     * 显示fragment
     */
    private void showFragment(){

        FragmentTransaction transaction = fragmentManager.beginTransaction();

        //如果之前没有添加过
        if(!fragments.get(currentIndex).isAdded()){

            // 第三个参数为添加当前的fragment时绑定一个tag
            transaction
                    .hide(currentFragment)
                    .add(R.id.layout_main_content,fragments.get(currentIndex),""+currentIndex); 

        }else{
            transaction
                    .hide(currentFragment)
                    .show(fragments.get(currentIndex));
        }

        currentFragment = fragments.get(currentIndex);
        transaction.commit();

    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容