Activity和多个fragments的切换及数据的传递

来源:互联网 发布:大数据 文化产业 编辑:程序博客网 时间:2024/05/18 23:26
最近做的项目中用到了工作流,工作流的第一个页面调取数据,展示UI,并提供后两个页面的数据,感觉用activity的跳转每次页面还得重新加载,数据展示也不是自己想要的,于是决定用activity+fragments。数据通过activity来传递。因为项目中的base activity和base fragment是自定义封装好的,所以只显示关键部分代码:
Activity:
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (null != mCreationFragmentV2 && (mCurrentFragment instanceof ProcessAdvancedCreationFragmentV2)) {
            mCreationFragmentV2.onActivityResult(requestCode, resultCode, data);
        }
        else if (null != mAssigmentFragment && (mCurrentFragment instanceof ProcessAdvancedCreationAssigmentFragment)) {
            mAssigmentFragment.onActivityResult(requestCode, resultCode, data);
        }
        else if (null != mLaunchDataFragment && (mCurrentFragment instanceof ProcessLaunchDataFragment)) {
            mLaunchDataFragment.onActivityResult(requestCode, resultCode, data);
        }
    }  
private void initFragmentList() {


        mBundle = new Bundle();
        mBundle.putSerializable(KEY_WORKFLOWMETA_REOCRD, mWorkflowMeta);
        mBundle.putSerializable(KEY_FORMTEMPLATE_LIST, mFormTemplateArrayList);
        mCreationFragmentV2 = new ProcessAdvancedCreationFragmentV2();
        mCreationFragmentV2.setChangeDataListener(this);
        mAssigmentFragment = new ProcessAdvancedCreationAssigmentFragment();
        mAssigmentFragment.setArguments(mBundle);
        mLaunchDataFragment = new ProcessLaunchDataFragment();
        mLaunchDataFragment.setArguments(mBundle);
        mCurrentFragment = mCreationFragmentV2;
        mManger = getSupportFragmentManager();
        mFragments = new ArrayList<>();
        mFragments.add(mCreationFragmentV2);
        mFragments.add(mAssigmentFragment);
        mFragments.add(mLaunchDataFragment);
    }
private void switchFragment() {
        if (mCurrentPosition < 0){
            mCurrentPosition = 0;
            return;
        }
        else if (mCurrentPosition > mFragments.size() - 1) {
            mCurrentPosition = mFragments.size() - 1;
            return;
        }


        if (!mFragments.get(mCurrentPosition).isAdded()) {
            mManger.beginTransaction().add(R.id.myv_fragment_container, mFragments.get(mCurrentPosition)).commit();
        }
        showFragment(mCurrentPosition);
    }
    private void showFragment(int curShowPosition) {
        if (null == mFragments) {
            return;
        }
        mCurrentFragment = mFragments.get(curShowPosition);
        for (int i = 0; i < mFragments.size(); i++) {
            FragmentTransaction fragmentTransaction = mManger.beginTransaction();


            if (i == curShowPosition) {
                fragmentTransaction.show(mFragments.get(i));
            }
            else {
                fragmentTransaction.hide(mFragments.get(i));
            }
            fragmentTransaction.commit();
        }
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if (item.getItemId() == R.id.myv_next) {
            mCurrentPosition += 1;
        }
        else if (item.getItemId() == android.R.id.home) {
            mCurrentPosition-=1;
            if (mCurrentPosition < 0) {
                onBackPressed();
            }
        }
        switchFragment();
        return true;
    }
//接口的实现 
    @Override
    public void updateActivityData(WorkflowMeta workflowMeta, ArrayList<FormTemplate> formTemplates) {
        this.mWorkflowMeta = workflowMeta;
        this.mFormTemplateArrayList = formTemplates;
        mBundle.putSerializable(KEY_WORKFLOWMETA_REOCRD, Record1);
        mBundle.putSerializable(KEY_FORMTEMPLATE_LIST, Record2);
    }
}
Fragment:
private ProcessUpdateActivityDataListener mDataListener;
mDataListener.updateActivityData(mWorkflowMeta, mFormTemplates);
 public void setChangeDataListener(ProcessUpdateActivityDataListener listener) {
        mDataListener = listener;
    }


  @Override
    public void onHiddenChanged(boolean hidden) {
        super.onHiddenChanged(hidden);
        if (!hidden) {
            getDataFromActivity();
        }
    }
 @Override
    public void onFragmentStart() {
        super.onFragmentStart();
        
getDataFromActivity();
 }
private void getDataFromActivity() { 
if (null != getArguments()) { 
mWorkflowMeta = (WorkflowMeta) getArguments().getSerializable(ProcessAdvancedCreateNewActivity.KEY_WORKFLOWMETA_REOCRD); 
mFormTemplates = (List<FormTemplate>) getArguments().getSerializable(ProcessAdvancedCreateNewActivity.KEY_FORMTEMPLATE_LIST); } }
数据传递实现的方法是:Activity-》Fragment: Bundle和setArguments()   Fragment->Activity Activity中实现接口的方式。
1 0