viewpager - view pager adapter android studio
¿Cómo deshabilitar el adaptador de viewpager al tocar vistas específicas? (3)
Estoy usando asi
public void setSwipeable(boolean swipeable)
{
this.swipeable = swipeable;
}
@Override
public void scrollTo(int x, int y){
if (swipeable){
super.scrollTo(x, y);
}
}
Tengo un viewpager que cambia entre pestañas al deslizar hacia la izquierda / derecha. En mi segunda pestaña, tengo algunas vistas personalizadas que tienen escuchas para pellizcar y arrastrar pero cuando intento pellizcar o arrastrar, el viewpager comienza a deslizar la página.
Una solución que me viene a la mente es desactivar el deslizamiento al tocar esas vistas específicas y solo deslizar al tocar fuera de esas vistas. ¿Es esto posible?
Actualizado: @Asok amablemente proporcionó la solución. Pero luego actualicé el código que no funcionaría en mi caso, así que publiqué el código anterior que funcionó para mí:
public class CustomViewPager extends ViewPager {
private boolean swipeable = true;
public CustomViewPager(Context context) {
super(context);
}
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
// Call this method in your motion events when you want to disable or enable
// It should work as desired.
public void setSwipeable(boolean swipeable) {
this.swipeable = swipeable;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
return (this.swipeable) ? super.onInterceptTouchEvent(arg0) : false;
}
Supongamos que tengo una vista que se puede arrastrar y necesito deshabilitar el desplazamiento cuando se arrastra, iniciar y volver a habilitar cuando se termina de arrastrar, así que en TouchEvent de mi llamada vista:
@Override
public boolean onTouchEvent(MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
//disable swiping when the button is touched
((ActivityOriginal) getActivity()).setSwipeable(false);
//the rest of the code...
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
//re enable swipping when the touch is stopped
//the rest of the code...
((ActivityOriginal) getActivity()).setSwipeable(true);
break;
}
return true;
}
Estoy utilizando requestDisallowInterceptTouchEvent(true) int en el oyente onTouchEvent de la vista que también tiene eventos de arrastre.
@Override
public boolean onTouchEvent(MotionEvent event) {
ViewParent parent = getParent();
// or get a reference to the ViewPager and cast it to ViewParent
parent.requestDisallowInterceptTouchEvent(true);
// let this view deal with the event or
return super.onTouchEvent(event);
}
Lo primero que me viene a la mente es tener un ViewPager
personalizado en el cual, cuando sus oyentes táctiles reciban una notificación de un evento específico, usted podría configurar el boolean
ViewPager
en ViewPager
en false y ViewPager
a establecer de la forma real que mejor se adapte a su aplicación. .
public class CustomViewPager extends ViewPager {
private boolean swipeable = true;
public CustomViewPager(Context context) {
super(context);
}
public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}
// Call this method in your motion events when you want to disable or enable
// It should work as desired.
public void setSwipeable(boolean swipeable) {
this.swipeable = swipeable;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent arg0) {
return (this.swipeable) ? super.onInterceptTouchEvent(arg0) : false;
}
}
Asegúrese de cambiar su archivo de diseño para mostrar:
<com.your.package.CustomViewPager .. />
En lugar de:
<android.support.v4.view.ViewPager .. />
Editar 2
Aquí está mi configuración (Trabajando con el CustomViewPager
anterior):
CustomViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Set up the action bar.
final ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
// Create the adapter that will return a fragment for each of the three
// primary sections of the app.
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
// Set up the CustomViewPager with the sections adapter.
mViewPager = (CustomViewPager) findViewById(R.id.pager);
mViewPager.setAdapter(mSectionsPagerAdapter);
mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(position);
}
});
// For each of the sections in the app, add a tab to the action bar.
for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
actionBar.addTab(actionBar.newTab()
.setText(mSectionsPagerAdapter.getPageTitle(i))
.setTabListener(this));
}
}
public void swipeOn(View v) {
mViewPager.setSwipeable(true);
}
public void swipeOff(View v) {
mViewPager.setSwipeable(false);
}
El onCreate
se muestra onCreate
está en mi clase MainActivity
que extiende FragmentActivity
e implementa ActionBar.TabListener