Functionality:
I'm developing some sort of configuration wizard, which may have many steps. Each step has it's own configuration, in this case, isSkippable()
whether if user can skip the step or not. And a callback method when user taps on menu item to go to next step, or indeed completed the wizard.
Issue: I don't have activity context, and my fields are also null when onStepCompleted
is called from activity.
Activity which extends ActionBarActivity
and doesn't implement any interface:
private WizardStepListener mStepListener;
private WizardPagerAdapter mPagerAdapter;
private ViewPager mViewPager;
public static Intent getIntent(final Context context) {
final Intent intent = new Intent(context, WizardActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP);
return intent;
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
if (mStepListener == null) {
return false;
}
switch (item.getItemId()) {
case R.id.action_step_skip:
moveToNextStep();
break;
case R.id.action_step_done:
case R.id.action_step_next:
final boolean stepCompleted = mStepListener.onStepCompleted();
if (stepCompleted && !isLastStep() || !stepCompleted) {
break;
}
final Intent intent = LandingActivity.getIntent(this);
WizardActivity.this.startActivity(intent);
overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_right);
WizardActivity.this.finish();
break;
}
return true;
}
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wizard);
final Resources resources = getResources();
final PagerTabStrip pagerTabStrip = (PagerTabStrip) findViewById(R.id.pager_tab_strip);
pagerTabStrip.setDrawFullUnderline(false);
pagerTabStrip.setBackgroundColor(resources.getColor(R.color.tabs_categories_background));
pagerTabStrip.setTextColor(Color.WHITE);
pagerTabStrip.setTabIndicatorColor(Color.WHITE);
mPagerAdapter = new WizardPagerAdapter(getSupportFragmentManager());
mViewPager = (ViewPager) findViewById(R.id.wizard_pager);
mViewPager.setAdapter(mPagerAdapter);
mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(final int position) {
setupView(position);
}
});
setupView(0);
}
private void setupView(final int position) {
final Fragment fragment = mPagerAdapter.getActiveFragment(mViewPager, position);
mStepListener =
fragment instanceof WizardStepListener ? (WizardStepListener) fragment : null;
supportInvalidateOptionsMenu();
}
private boolean isLastStep() { ... }
private boolean moveToNextStep() { ... }
}
Fragment which extends Fragment
and implements LoaderManager.LoaderCallbacks>, WizardStepListener:
private CategoriesExpandableAdapter mCatAdapter;
private ViewFlipper mViewFlipper;
/**
* @return A new instance of fragment WizardCategories.
*/
public static WizardCategories newInstance() {
return new WizardCategories();
}
@Override
public boolean isSkippable() {
return false;
}
@Override
public boolean onStepCompleted() {
if (!isAdded()) {
return false;
}
if (mCatAdapter == null || !mCatAdapter.hasCheckedCategories()) {
FeedbackToast.getInstance(
getActivity(),
"Debes seleccionar al menos una categoría",
FeedbackToast.NEGATIVE
).show();
return false;
}
...
return true;
}
The PagerAdapter which extends FragmentPagerAdapter
:
private final FragmentManager mFragmentManager;
public WizardPagerAdapter(final FragmentManager fm) {
super(fm);
mFragmentManager = fm;
}
@Override
public Fragment getItem(final int position) {
final Fragment fragment;
switch (position) {
case 0:
fragment = WizardCategories.newInstance();
break;
default:
fragment = new Fragment();
break;
}
return fragment;
}
public Fragment getActiveFragment(final ViewPager container, final int position) {
final String name = makeFragmentName(container.getId(), position);
final Fragment fragment = mFragmentManager.findFragmentByTag(name);
return fragment != null ? fragment : getItem(position);
}
private static String makeFragmentName(final int viewId, final int index) {
return "android:switcher:" + viewId + ":" + index;
}
What I've tried:
- Changing PagerAdapter extends to
FragmentStatePagerAdapter
with no luck. - Retrieving fragment from FragmentManager by using
getActiveFragment
seen in another maybe related posts.
Additional comments:
- Fragment's
isAdded()
always returns false. - Calling
getActivity()
on fragment'sonStepCompleted
always returns null.