¿Botones en un cajón corredizo? – Android

Okey, por lo que he implementado un botón en un cajón deslizante en una aplicación Android que estoy construyendo. El único problema es que cuando presiono el botón todo el cajón deslizante es presionado y se desliza hacia arriba.

Sé que puedo deshabilitar "presione para deslizar para arriba" en el XML, pero eso no parece trabajar mientras que el cajón que resbala todavía se presiona apenas sin la diapositiva para arriba.

Si llamo a slidingDrawer.lock (); Función el botón realmente funciona, pero entonces el cajón deslizante no se puede deslizar hacia arriba o incluso se presiona hacia arriba.

¿Cualquiera tiene una solución simple a este problema?

Si entiendo bien que ha añadido botones en su asa de deslizamientoDrawer y desea que funcionen como botones cuando el usuario presionarlos con mantener un comportamiento estándar de deslizamiento cuando el manejador es presionado / arrastrado?

Acabo de solucionar un problema similar.

Mi mango estaba mirando algo así:

Captura del diseño

Se compone de dos botones y un TextView de centro que será el identificador real (que reacciona como un tirador estándar de SlidingDrawer).

Para hacer que los botones funcionen independientemente del SlidingDrawer, cambié un código fuente en el método onInterceptTouchEvent de la clase SlidingDrawer.java estándar (copiar pegar el archivo fuente desde el origen del código android):

public boolean onInterceptTouchEvent(MotionEvent event) { //... final Rect frame = mFrame; final View handle = mHandle; // original behaviour //mHandle.getDrawingRect(frame); // New code View trackHandle = mTrackHandle; // set the rect frame to the mTrackHandle view borders instead of the hole handle view // getParent() => The right and left are valid, but we need to get the parent top and bottom to have absolute values (in screen) frame.set(trackHandle.getLeft(), ((ViewGroup) trackHandle.getParent()).getTop(), trackHandle.getRight(), ((ViewGroup) trackHandle.getParent()).getBottom()); if (!mTracking && !frame.contains((int) x, (int) y)) { return false; } //... } 

También he añadido un setter para el atributo mTrackHandle para establecer, durante la creación de la actividad, el hanlde real a utilizar:

 protected void onCreate(Bundle savedInstanceState) { //... mSlidingDrawer.setTrackHandle((View) findViewById(R.id.menu_handle_TextView_Title)); //... } 

Después de que usted puede establecer el oyente estándar en sus dos botones. Trabajarán como un encanto.

En respuesta a Joakim Engstrom: Sí, eso es posible! Para hacer que tienes que anular onInterceptTouchEvent como sigue.

  @Override public boolean onInterceptTouchEvent(MotionEvent event) { // TODO Auto-generated method stub rect = new Rect(handle.getLeft(), ((View) handle.getParent()).getTop(), handle.getRight(), ((View) handle.getParent()).getBottom()); if (!rect.contains((int) event.getX(), (int) event.getY())) { if (event.getAction() == MotionEvent.ACTION_UP) this.lock(); else this.unlock(); return false; } else { this.unlock(); return super.onInterceptTouchEvent(event); } } 

También tiene que agregar un setter para establecer el manejador a la vista del manejador real durante la creación de la actividad.

Puede ser este código puede ayudarle https://github.com/xPutnikx/SlidingDrawerWithButtons

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.