with viewpager studio fragments example android android-viewpager

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