Skip to content

Commit

Permalink
Fixed #20, fragments get reused from fragment manager on configuratio…
Browse files Browse the repository at this point in the history
…n changes; Added RestorableSlide which youo can extend if you want your custom Slides to get restored too
  • Loading branch information
janheinrichmerker committed Apr 2, 2016
1 parent cb45cd1 commit f4c3019
Show file tree
Hide file tree
Showing 8 changed files with 169 additions and 80 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,11 @@

@SuppressLint("Registered")
public class IntroActivity extends AppCompatActivity {
private static final String KEY_CURRENT_ITEM =
"com.heinrichreimersoftware.materialintro.app.IntroActivity.KEY_CURRENT_ITEM";

private static final String KEY_SLIDES =
"com.heinrichreimersoftware.materialintro.app.IntroActivity.KEY_SLIDES";

private final ArgbEvaluator evaluator = new ArgbEvaluator();
private FrameLayout frame;
Expand Down Expand Up @@ -68,6 +73,10 @@ protected void onCreate(Bundle savedInstanceState) {
setFullscreenFlags(fullscreen);
}

if (savedInstanceState != null && savedInstanceState.containsKey(KEY_CURRENT_ITEM)) {
position = savedInstanceState.getInt(KEY_CURRENT_ITEM, position);
}

setContentView(R.layout.activity_intro);
findViews();
}
Expand All @@ -82,12 +91,12 @@ protected void onPostCreate(Bundle savedInstanceState) {
updateButtonSkipDrawable();
frame.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
public void onLayoutChange(View v, int left, int top, int right, int bottom,
int oldLeft, int oldTop, int oldRight, int oldBottom) {
updateViewPositions();
v.removeOnLayoutChangeListener(this);
}
});
lockSwipeIfNeeded();
}

@Override
Expand All @@ -96,6 +105,12 @@ protected void onResume() {
setFullscreenFlags(fullscreen);
}

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(KEY_CURRENT_ITEM, pager.getCurrentItem());
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
Expand Down Expand Up @@ -133,10 +148,12 @@ private void findViews(){
buttonNext = findViewById(R.id.mi_button_next);
buttonSkip = findViewById(R.id.mi_button_skip);

adapter = new SlideAdapter(getSupportFragmentManager());
FragmentManager fragmentManager = getSupportFragmentManager();
adapter = new SlideAdapter(fragmentManager);

pager.setAdapter(adapter);
pager.addOnPageChangeListener(listener);
pager.setCurrentItem(position);

pagerIndicator.setViewPager(pager);

Expand Down Expand Up @@ -533,7 +550,7 @@ protected boolean isEmpty() {
}

protected int getCount() {
return adapter.getCount();
return adapter == null ? 0 : adapter.getCount();
}

protected int lastIndexOfSlide(Object object) {
Expand Down Expand Up @@ -571,6 +588,11 @@ public void onPageScrolled(int position, float positionOffset, int positionOffse
IntroActivity.this.position = position;
IntroActivity.this.positionOffset = positionOffset;

//Lock while scrolling a slide near its edges to lock (uncommon) multiple page swipes
if (Math.abs(positionOffset) < 0.1f) {
lockSwipeIfNeeded();
}

updateBackground();
updateViewPositions();
updateFullscreen();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public boolean canGoBackward() {
return true;
}

protected void updateNavigation() {
public void updateNavigation() {
if (getActivity() instanceof IntroActivity) {
((IntroActivity) getActivity()).lockSwipeIfNeeded();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,17 @@
import android.support.annotation.ColorRes;
import android.support.annotation.LayoutRes;
import android.support.annotation.StyleRes;
import android.support.v4.app.Fragment;
import android.support.v7.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.heinrichreimersoftware.materialintro.app.SlideFragment;

public class FragmentSlide extends Slide{
public class FragmentSlide extends RestorableSlide {

private final android.support.v4.app.Fragment fragment;
private Fragment fragment;
@ColorRes
private final int background;
@ColorRes
Expand All @@ -33,10 +34,15 @@ private FragmentSlide(Builder builder) {
}

@Override
public android.support.v4.app.Fragment getFragment() {
public Fragment getFragment() {
return fragment;
}

@Override
public void setFragment(Fragment fragment) {
this.fragment = fragment;
}

@Override
public int getBackground() {
return background;
Expand All @@ -49,22 +55,22 @@ public int getBackgroundDark() {

@Override
public boolean canGoForward() {
if (fragment instanceof SlideFragment) {
return ((SlideFragment) fragment).canGoForward();
if (getFragment() instanceof SlideFragment) {
return ((SlideFragment) getFragment()).canGoForward();
}
return canGoForward;
}

@Override
public boolean canGoBackward() {
if (fragment instanceof SlideFragment) {
return ((SlideFragment) fragment).canGoBackward();
if (getFragment() instanceof SlideFragment) {
return ((SlideFragment) getFragment()).canGoBackward();
}
return canGoBackward;
}

public static class Builder{
private android.support.v4.app.Fragment fragment;
private Fragment fragment;
@ColorRes
private int background;
@ColorRes
Expand All @@ -74,18 +80,18 @@ public static class Builder{

private boolean canGoBackward = true;

public Builder fragment(android.support.v4.app.Fragment fragment) {
public Builder fragment(Fragment fragment) {
this.fragment = fragment;
return this;
}

public Builder fragment(@LayoutRes int layoutRes, @StyleRes int themeRes) {
this.fragment = Fragment.newInstance(layoutRes, themeRes);
this.fragment = FragmentSlideFragment.newInstance(layoutRes, themeRes);
return this;
}

public Builder fragment(@LayoutRes int layoutRes) {
this.fragment = Fragment.newInstance(layoutRes);
this.fragment = FragmentSlideFragment.newInstance(layoutRes);
return this;
}

Expand Down Expand Up @@ -116,17 +122,17 @@ public FragmentSlide build(){
}
}

public static class Fragment extends android.support.v4.app.Fragment{
public static class FragmentSlideFragment extends Fragment {
private static final String ARGUMENT_LAYOUT_RES =
"com.heinrichreimersoftware.materialintro.SimpleFragment.ARGUMENT_LAYOUT_RES";
private static final String ARGUMENT_THEME_RES =
"com.heinrichreimersoftware.materialintro.SimpleFragment.ARGUMENT_THEME_RES";

public Fragment() {
public FragmentSlideFragment() {
}

public static Fragment newInstance(@LayoutRes int layoutRes, @StyleRes int themeRes) {
Fragment fragment = new Fragment();
public static FragmentSlideFragment newInstance(@LayoutRes int layoutRes, @StyleRes int themeRes) {
FragmentSlideFragment fragment = new FragmentSlideFragment();

Bundle arguments = new Bundle();
arguments.putInt(ARGUMENT_LAYOUT_RES, layoutRes);
Expand All @@ -136,7 +142,7 @@ public static Fragment newInstance(@LayoutRes int layoutRes, @StyleRes int theme
return fragment;
}

public static Fragment newInstance(@LayoutRes int layoutRes) {
public static FragmentSlideFragment newInstance(@LayoutRes int layoutRes) {
return newInstance(layoutRes, 0);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.heinrichreimersoftware.materialintro.slide;

import android.support.v4.app.Fragment;

public abstract class RestorableSlide extends Slide {
public abstract void setFragment(Fragment fragment);
}
Loading

0 comments on commit f4c3019

Please sign in to comment.