美文网首页
MVP模式中Fragment中启动activity使用了star

MVP模式中Fragment中启动activity使用了star

作者: hai_phon | 来源:发表于2018-11-21 16:38 被阅读0次

1.需求介绍:在首页的Fragment展示了n个卡片,每个卡片点击都需要打开详情页,这个详情页是前端给的URL地址,用的WebView封装在一个WebViewActivity打开,用户可能在前端那边可能做了一些数据的操作,需要在回来的时候刷新一遍数据,另外用了MVP模式,效果图如下图一:

效果图.png
2.问题
用户从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);
    }

相关文章

网友评论

      本文标题:MVP模式中Fragment中启动activity使用了star

      本文链接:https://www.haomeiwen.com/subject/ppycqqtx.html