1. 概述
在开发过程中,activity与fragment之间互相跳转很常见,这里记录下自己在项目中遇到的二者互相跳转的场景;
2. 具体场景
场景1:AActivity 跳转 另一个BActivity 中其中一个fragment:
如果BActivity中的多个fragment用的框架是 TabPageIndicator+ViewPager 或者 TabLayout+ViewPager等这种结构的,如下图所示:
跳转方法如下:
- 在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中
有时候在项目中一次性连续跳转了多个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();
}