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