Activity與Fragment之間跳轉(zhuǎn)場景

1. 概述

在開發(fā)過程中,activity與fragment之間互相跳轉(zhuǎn)很常見,這里記錄下自己在項(xiàng)目中遇到的二者互相跳轉(zhuǎn)的場景;

2. 具體場景

場景1:AActivity 跳轉(zhuǎn) 另一個(gè)BActivity 中其中一個(gè)fragment:

如果BActivity中的多個(gè)fragment用的框架是 TabPageIndicator+ViewPager 或者 TabLayout+ViewPager等這種結(jié)構(gòu)的,如下圖所示:


圖片.png

跳轉(zhuǎn)方法如下:

  • 在AActivity中,跳轉(zhuǎn)到OrderListActivity中,OrderListActivity就相當(dāng)于是 BActivity ,代碼如下:
Intent intent = new Intent(this , OrderListActivity.class) ;
// 如果提交的店鋪個(gè)數(shù)是多個(gè),點(diǎn)擊叉號跳轉(zhuǎn) 我的 - 待付款fragment列表
// waitPayFlag是一個(gè)標(biāo)識,用于標(biāo)識跳轉(zhuǎn)到 我的 - 待付款fragment列表
intent.putExtra("waitPayFlag" , "1") ;
startActivity(intent);
finishActivity(PayActivity.this);
  • 在OrderListActivity中,取出waitPayFlag,代碼如下:
@Override
public void initView() {

    // 這個(gè) waitPayFlag 就是從 第一個(gè)AActivity中跳轉(zhuǎn)過來傳遞過來的參數(shù)
    // 從購物車頁面,如果提交的店鋪個(gè)數(shù)是多個(gè),點(diǎn)擊叉號跳轉(zhuǎn) 我的 - 待付款fragment列表
    // 取出從PayActivity中購物車的標(biāo)識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()中,然后設(shè)置viewPager.setCurrentItem(1),界面可以出來,但是就是
    // 不能加載數(shù)據(jù)

    // 第一:獲取waitPayFlag一定要在initView()方法中,不要寫到onResume()中;
    // 第二:下邊設(shè)置viewPager.setCurrentItem(1)這句代碼一定要寫到 上邊viewPager的 findViewById的下邊,
    // 否則跳轉(zhuǎn)到的目標(biāo)fragment顯示不出來


    // 從購物車頁面,如果提交的店鋪個(gè)數(shù)是多個(gè),點(diǎn)擊叉號跳轉(zhuǎn) 我的 - 待付款fragment列表
    // 1表示:用于從PayActivity中點(diǎn)擊叉號跳轉(zhuǎn)待付款的fragment
    if(!TextUtils.isEmpty(waitPayFlag)){
          if ("1".equals(waitPayFlag)) {
               // 這里設(shè)置要跳轉(zhuǎn)到第幾個(gè)fragment
               viewPager.setCurrentItem(1);
          }
     }
}
場景2:從任意一個(gè)activity或者fragment中 返回到MainActivity中任意一個(gè)fragment中
圖片.png

有時(shí)候在項(xiàng)目中一次性連續(xù)跳轉(zhuǎn)了多個(gè)Activity,需要點(diǎn)擊該Activity的某個(gè)按鈕執(zhí)行完操作后,直接返回到 MainActivity 中的 某個(gè)fragment中,比如返回到 購物車的 fragment中,方法如下:

可以采用 intent攜帶參數(shù)然后跳轉(zhuǎn)到MainActivity中,然后在 MainActivity中 復(fù)寫onNewIntent()方法,在這個(gè)方法中取出 剛才傳遞過來的 值,通過這個(gè)值來判斷 顯示對應(yīng)fragment,代碼如下:

比如自己項(xiàng)目是 從首頁一直跳轉(zhuǎn)到 VoucherSuccessActivity中,然后點(diǎn)擊VoucherSuccessActivity 中的一個(gè)完成按鈕,直接返回到 首頁的 購物車的fragment:

  • VoucherSuccessActivity 代碼如下:
// 由于 activity不能直接跳轉(zhuǎn)到 fragment,需要先去跳轉(zhuǎn)到 MainActivity 中,
// 根據(jù)在 MainActivity 中顯示的方法去顯示需要的fragment即可
Intent intent=new Intent(VoucherSuccessActivity.this, MainActivity.class);
intent.putExtra("juanFlag","1");    // 1表示領(lǐng)券成功后 需要跳轉(zhuǎn)到劵包fragment
startActivity(intent);
overridePendingTransition(R.anim.activity_in_from_right,
                R.anim.activity_out_to_left);

AppManager.getAppManager().finishAllActivity();
  • 在 MainActivity 中 復(fù)寫 onNewIntent()方法,然后取出傳遞的參數(shù),然后判斷:
    /**
     * 在onNewIntent方法中進(jìn)行的判斷,然后顯示MainActivity中對應(yīng)的fragment即可,
     * 只要執(zhí)行這個(gè)方法就不會執(zhí)行onCreate()方法,
     *
     * 執(zhí)行順序如下:
     *      onNewIntent()---->onResart()------>onStart()----->onResume()生命周期就發(fā)生了更改
     */
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        String juanFlag = intent.getStringExtra("juanFlag");
        if (!TextUtils.isEmpty(juanFlag)){
            if ("1".equals(juanFlag)) {
                goFragmentIndex();
            }
        }
    }

    /**
     * 用于接收從商品詳情 跳轉(zhuǎn)到購物車fragment的id值
     */
    private void goFragmentIndex() {

        // 這里直接給currentIndex角標(biāo)設(shè)置數(shù)字,然后調(diào)用showFragment()及對應(yīng)圖標(biāo)和文字切換,
        // 就可以正常從任意界面切換到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()){

            // 第三個(gè)參數(shù)為添加當(dāng)前的fragment時(shí)綁定一個(gè)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. 注意事項(xiàng)

注意上邊的2個(gè)場景是不同的2個(gè)場景:

場景1:采用框架是 TabPageIndicator + ViewPager ,中間切換的多個(gè) ViewPager 用 fragment來 設(shè)置;

直接可以通過 傳遞過來的 flag,然后設(shè)置 要顯示的 ViewPager 的fragment即可:

if(!TextUtils.isEmpty(waitPayFlag)){
          if ("1".equals(waitPayFlag)) {
               // 這里設(shè)置要跳轉(zhuǎn)到第幾個(gè)fragment
               viewPager.setCurrentItem(1);
          }
     }
場景2:采用的是 FrameLayout(中間布局) + LinearLayout(水平方向 ImageView + TextView),需要用 如下類似方式實(shí)現(xiàn):
    /**
     * 使用show() hide()切換頁面
     * 顯示fragment
     */
    private void showFragment(){

        FragmentTransaction transaction = fragmentManager.beginTransaction();

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

            // 第三個(gè)參數(shù)為添加當(dāng)前的fragment時(shí)綁定一個(gè)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();

    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容