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();

    }

你可能感兴趣的:(Activity与Fragment之间跳转场景)