Ich entwickle eine App und derzeit versuche ich ScreenSlide
dazu hinzuzufügen. Ich schaffte es, dies unter Verwendung einer tutorial zu tun, aber gewöhnliches Gleiten zwischen x
Seiten ist nicht ganz das, was ich suche.Verschieben zwischen Fragmenten
Mit dem unten angegebenen Code kann ich zwischen 5 Seiten gleiten, aber die Seiten sind in einer geraden Linie ausgerichtet und Sie können nicht von der ersten Seite direkt in die 5. und umgekehrt gehen. In meiner App habe ich 4 Seiten. Wenn ich nach links rutsche, wechsle ich zwischen den ersten beiden Seiten, wenn ich nach rechts rutsche, wechsle ich zwischen zwei letzten Seiten. Auf dem Bild unten können Sie sehen, wie mein aktueller Code die Seite wechselt und darunter - mein Ziel.
public class MainActivity extends FragmentActivity {
private static final int NUM_PAGES = 5;
private ViewPager mPager;
private ScreenSlidePageFragment[] pages = new ScreenSlidePageFragment[NUM_PAGES];
private PagerAdapter mPagerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_screen_slide);
mPager = (ViewPager) findViewById(R.id.pager);
mPagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
mPager.setAdapter(mPagerAdapter);
}
@Override
public void onBackPressed() {
if (mPager.getCurrentItem() == 0) {
super.onBackPressed();
} else {
mPager.setCurrentItem(mPager.getCurrentItem() - 1);
}
}
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
public ScreenSlidePagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return NUM_PAGES;
}
@Override
public Fragment getItem(int position) {
boolean moveRight = mPager.getCurrentItem() < position;
boolean moveLeft = mPager.getCurrentItem() > position;
switch(position){
case 5:
if(moveRight){
return geLog.w("i"
+ "Info", Integer.toString(position));
//return getPageByPosition(2);
if(moveLeft)
return getPageByPosition(2);
}
return new ScreenSlidePageFragment();
}
private Fragment getPageByPosition(int position){
int index = position - 1;
if(index < 0 || index > NUM_PAGES-1)
throw new InvalidParameterException("requested position is invalid");
if(pages[index] == null)
pages[index] = new ScreenSlidePageFragment();
return pages[index];
}
}
}
[UPDATE]
Ich habe es geschafft, einen Code zu schreiben, die mir zwischen 6 verschiedenen Seiten nach rechts unendlich gleiten kann. Die linke Seite ist jedoch begrenzt - ich kann nur auf die erste Seite gleiten (also wenn ich auf der ersten Seite bin, nachdem ich dreimal nach rechts gefahren bin, kann ich nur 3 Zyklen rückwärts machen). Ich denke, ich bin sehr nahe daran, die Lösung zu finden. Irgendwelche Ideen?
MainActivity.java
public class MainActivity extends FragmentActivity {
private static final int NUM_PAGES = 6;
private ViewPager pager;
private PagerAdapter pagerAdapter;
private List<ScreenSlidePageFragment> slideList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
slideList = new ArrayList<ScreenSlidePageFragment>();
for (int i = 0; i<NUM_PAGES; i++){
ScreenSlidePageFragment slide = new ScreenSlidePageFragment();
slide.setIndex(i+1);
slideList.add(slide);
}
pager = (ViewPager) findViewById(R.id.pager);
pagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
pager.setAdapter(pagerAdapter);
}
private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
public ScreenSlidePagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
int _pos = position % NUM_PAGES;
return slideList.get(_pos);
}
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
}
}
ScreenSlidePageFragment.java
public class ScreenSlidePageFragment extends Fragment {
private int index;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ViewGroup root = (ViewGroup)inflater.inflate(R.layout.slide, container, false);
TextView tw = (TextView) root.findViewById(R.id.textView);
tw.setText(Integer.toString(index));
return root;
}
public void setIndex(int index){
this.index = index;
}
}
schöne Zeichnung :) – Sunny
Dies ist ein so verwirrender Fluss in Bezug auf Seite Dauerhaftigkeit und Benutzererfahrung, die ich Sie Ihr Navigations Design überdenken sehr empfehlen. Davon abgesehen müssen Sie wahrscheinlich die Animation und die Gestenerkennung selbst durchführen, anstatt den Pager-Adapter zu verwenden. Andernfalls müssen Sie den Pager-Adapter nach jedem Seitenwechsel ändern. http://developer.android.com/reference/android/support/v4/app/FragmentPagerAdapter.html –
Ich gab Ihnen +1 für die Zeichnung :-) – Christine