MVP模式中Fragment中启动activity使用了star
2018-11-21 本文已影响0人
hai_phon
1.需求介绍:在首页的Fragment展示了n个卡片,每个卡片点击都需要打开详情页,这个详情页是前端给的URL地址,用的WebView封装在一个WebViewActivity打开,用户可能在前端那边可能做了一些数据的操作,需要在回来的时候刷新一遍数据,另外用了MVP模式,效果图如下图一:
效果图.png2.问题
用户从WebView所在的WebViewActivity中点击返回到MainActivity的ImNativeFragment中onActivityResult()没被调用:
ImNativeFragment中启动WebViewActivity的方式如下:
/**
* 根据keyWord合成相应的url,打开Url。
* @param keyWord
*/
private void startActivity(String keyWord) {
String paramString = ACache.get(mContext).getAsString("phone") + "&token=Basic " + ACache.get(mContext).getAsString(CacheKey.KEY_TOKEN);
String urlH5 = ApiConfig.BaseUrl_Dsd_Web + keyWord + paramString;
Intent intent = new Intent(mContext, WebActivity.class);
intent.putExtra("url", urlH5);
((Activity)mContext).startActivityForResult(intent, REQUEST_CODE);
}
解决过程:
1.先看代码代码结构,如下图:
image.png
解释:因为是MVP模式,所以Fragment中并没有做任何的逻辑操作,只是加载了布局,Presenter中实现了UI的显示逻辑和按钮的响应事件等,所以Presenter中有Fragment的getActivity(),其实就是Fragment的所属的MainActivity的上下文。
所以上面的启动核心代码是:
((Activity)mContext).startActivityForResult(intent, REQUEST_CODE);
2.Fragment使用startActivityForResult有一个注意点,就是不能用getActivity().startActivityForResult(),否则拿不到回调,所以问题就是在这里,上面((Activity)mContext)明显就是用了MainActivty来启动了。
3.现在问题就是如何通过mContext拿到ImNativeFragment,通过ImNativeFragment来启动。
要想拿到一个Activity中的Fragment,可以通过这个方法:
// 这里的R.id.xxx必须是Activity里给Fragment预备的FrameLayout布局,看下图
FragmentActivity.getSupportFragmentManager().findFragmentById(R.id.xxx)
R.id.XXX是MainActivity中给ImNativeFragment用的布局,所在布局如图:
image.png
所以最后解决方法是:
/**
* 根据keyWord合成相应的url,打开Url。
* @param keyWord
*/
private void startActivity(String keyWord) {
String paramString = ACache.get(mContext).getAsString("phone") + "&token=Basic " + ACache.get(mContext).getAsString(CacheKey.KEY_TOKEN);
String urlH5 = ApiConfig.BaseUrl_Dsd_Web + keyWord + paramString;
Intent intent = new Intent(mContext, WebActivity.class);
intent.putExtra("url", urlH5);
// Fragment中startActivityForResult,前边不需要加getActivity(),不然在Fragment中拿不到返回结果,所以这里先拿到Fragment再执行。
((android.support.v4.app.Fragment)((MainActivity)mContext).getSupportFragmentManager().findFragmentById(R.id.main_content_fl)).
startActivityForResult(intent, REQUEST_CODE);
}