背景:今天遇到一个问题,虽然不是很小但是也不是很大,就是从fragmentA准确的跳到fragmentB去,还有就是从Activity准确的跳到fragment 去,后面这个问题让我想了好半天,最后还是处理了,处理这个问题就不要用广播去传值解决了,因为会出现…… after on saveInstance错误。
处理1:fragment跳到fragment的问题
Fragment跳到fragment如果中间不经过切换两个或两个以上的宿主Activity的话是很简单的,但是如果中间要更换宿主Activity这也能解决。
先解决不经过切换宿主activity跳转的fragment的跳转,比如在主页面就会经常用到几个fragment相互切换,当然用fragment的回退栈也可以,但是如果不按顺序去跳转呢,而且底部图标跟着变化呢,是不是会很麻烦呢。还是使用简单的方法吧。
以MainActivity由几个fragment组成为例,要相互跳转,先在宿主MainActivity里面写一个public方法:
private FragmentManager fmanager;
private FragmentTransaction ftransaction;
public void gotoDownloadFragment() { //去下载页面
fmanager = getSupportFragmentManager();
ftransaction = fmanager.beginTransaction();
mDownloadFragment = new DownloadFragment();
ftransaction.replace(R.id.rl_fragment_container, mDownloadFragment);
ftransaction.commit();
}
MainActivity mainActivity = (MainActivity) getActivity();
mainActivity. gotoDownloadFragment ();
对,就这样就切换到了DownLoadFragment,是不是很简单。
处理2:现在解决需要切换两个不同宿主Activity中的两个fragment之间进行切换。这儿就得使用startActivityForResult()了,startActivityForResult的主要作用就是它可以回传数据,假设我们有两个页面,首先进入第一个页面,里面有一个按钮,用于进入下一个页面,当进入下一个页面时,进行设置操作,并在其finish()动作或者back动作后,将设置的值回传给第一个页面,从而第一个页面来显示所得到的值。这个有一点像回调方法,就是在第二个页面finish()动作或者back动作后,会回调第一个页面的onActivityResult()方法。不明白可以参考网址:http://www.jb51.net/article/47599.htm
举个例子就知道了:
首先我们的目的:BActivity中的BourFragment点击跳转按钮跳转到MainActivity中的DownloadFragment。
我现在找一个入口是从MainActivity中的PersonFragment要跳转到BActivity中的BourFragment,然而我们的目的是从BourFragment点击跳转到MainActivity中的DownloadFragment。一定要理清这个逻辑,耐心看。
这个相当于是跑了一圈似的,但是首先要明确我们的目的。我提供的入口是PersonFragment,当然也可以是MainActivity中的任意fragment,这仅仅是个例子。首先,我们在PersonFragment中使用startActivityForResult的方式跳转它的宿主Activity:
startActivityForResult(new Intent(context,BActivity.class),1); //requestcode设的是1
然后在BourFragment中给跳转按钮中这样写:
BActivity bActivity= (BActivity) getActivity();
bActivity. onSetResult ();
这样,一为了响应PersonFragment,二是为了finish掉BActivity,这样岂不是又回到了MainActivity中,然后入口是PersonFragment,BActivity被finish掉之后,出口自然也是PersonFragment,因为这个fragment的状态未被销毁掉,这个你可以参考:http://blog.csdn.net/wenxuzl99/article/details/16112725
最后,既然又回到MainActivity中的PersonFragment了,我只要在这里重写onActivityResult方法判断需求码和结果码就可以回到DownloadFragment了。当然一定要记得,在MainActivity中定义跳转到DownloadFragment的public void gotoDownloadFragment()方法。private MainActivity mainActivity;
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1 && resultCode == 2) {
mainActivity = (MainActivity) getActivity();
mainActivity. gotoDownloadFragment ();
}
}
大功告成了!终于解决了,fragment之间相互跳转的难题了。
下一节说一下,要经过好几个Activity的跳转,从AActivity->BActivity ->CActivity一直跳转之后,再从CActivity中跳转到AActivity的DownloadFragment里面。可以先思考一下,然后再参考我的思路。
下一篇:【Android 解决Activity跳转到任意Fragment的问题,或多层次Activity跳转解决问题】
纪实:2016.01.24