最近做的项目中用到了工作流,工作流的第一个页面调取数据,展示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中实现接口的方式。
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中实现接口的方式。
本文介绍了一种利用Activity结合Fragments实现多页面工作流的方法。这种方法通过Activity管理数据及页面跳转,利用Fragments展示不同阶段的内容。文章详细展示了如何初始化Fragment列表、在Fragments间切换以及如何在Activity与Fragments之间传递数据。

516

被折叠的 条评论
为什么被折叠?



