J'ai écrit un ViewPager
personnalisé pour désactiver Swipe Scroll
, Mais je veux balayer par programme. J'ai trois Tab
dans mon pager de vue, mais quand j'appelle viewPager.setCurrentItem(viewPager.getCurrentItem()+1)
sur le premier Fragment
, il passe au troisième Fragment
au lieu du second Fragment
. Et si j'appelle la même fonction dans le deuxième Fragment
, il passe au troisième. Si j'appelle (viewPager.getCurrentItem () - 1) `dans le troisième fragment, cela fonctionne très bien en reculant. Toute aide serait appréciée. Mon code est ci-dessous:
NonSwipeAbleViewPager
public class NonSwipeableViewPager extends ViewPager {
private boolean swipeable;
public NonSwipeableViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyViewPager);
try {
swipeable = a.getBoolean(R.styleable.MyViewPager_swipeable, true);
} finally {
a.recycle();
}
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return swipeable ? super.onInterceptTouchEvent(event) : false;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return swipeable ? super.onTouchEvent(event) : false;
}
}
Déclaration en XML
<co.example.customview.NonSwipeableViewPager
Android:id="@+id/pager"
Android:layout_width="match_parent"
Android:layout_height="0dp"
Android:layout_weight="1"
app:swipeable="false" />
L'appeler
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menuNext:
NonSwipeableViewPager pages = (NonSwipeableViewPager) getActivity().findViewById(R.id.pager);
pages.setCurrentItem(pages.getCurrentItem()+1, true);
break;
default:
return super.onOptionsItemSelected(item);
}
return super.onOptionsItemSelected(item);
}
Dans votre utilisation PagerActivity
viewPager = (ViewPager) findViewById(R.id.view_pager);
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
int pagei = position + 1;
pages=pagei + "";
Toast.makeText(PagerActivity.this, getString(R.string.changeinfopage) + " " + pages, Toast.LENGTH_SHORT).show();
}
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
et
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_previous:
viewPager.setCurrentItem(viewPager.getCurrentItem() - 1);
return true;
case R.id.action_next:
viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
return true;
}
return super.onOptionsItemSelected(item);
}
viewPager.setCurrentItem(idx);
où idx est un entier basé sur 0.
essaye ça :
viewPager.postDelayed(new Runnable() {
@Override
public void run() {
viewPager.setCurrentItem(position);
}
}, 10);
parfois, setCurrentItem sur viewpager ne fonctionne pas. Comme le contenu du téléavertisseur était contrôlé par un spinner. à la fois les spinners et l'état des pagers ont été restaurés sur Resume, et pour cette raison, l'écouteur spinners onItemSelected a été appelé lors du cycle de propagation d'événement suivant.
En utilisant le gestionnaire, nous pouvons faire ce travail car il définit la position actuelle du pageur après le déclenchement de l'événement onItemSelected.