Agregar a un control SlidingDrawer?

He estado trabajando en esto por un tiempo. La Idea empezó de forma sencilla, quería que un botón en un identificador de SlidingDrawer permitiera al usuario ver la configuración específica del contenido del cajón. Así que hice un diseño con un botón a un lado y lo puso como el mango. El cajón estaba muy bien, pero no permitiría presionar el botón (en el mango). Cada vez que intento hacer clic en la cosa, el clic se interpreta como un clic de manejar, y alternar el estado del cajón.

¿Alguien sabe lo que está pasando?

Gracias ~ Aedon

4 Solutions collect form web for “Agregar a un control SlidingDrawer?”

Puede suprimir la acción que interpreta un clic en el botón de control como un "abierto" con un atributo en el elemento SlidingDrawer en el XML de presentación. Me gusta esto:

<SlidingDrawer android:layout_width="fill_parent"android:id="@+id/SlidingDrawer" android:handle="@+id/slideHandleButton" android:content="@+id/txtHolder" android:layout_height="fill_parent" android:orientation="horizontal" android:allowSingleTap="false"> 

Sólo android:allowSingleTap="false" hacer el android:allowSingleTap="false" Entonces, simplemente implementar un controlador de clic para el botón como lo haría normalmente. Esto evitará que abra / cierra el cajón, pero es posible que necesite interceptar los eventos del botón para lograr que haga lo que USTED desea que haga.

Publicaré mi implementación, para salvar a otros del problema.

Básicamente tienes que extender la clase SlidingDrawer y manejar los eventos onInterceptTouch para pasar a través de cuando están encima de los elementos dentro del diseño de la manija.

Esto supone que está utilizando un ViewGroup (por ejemplo, cualquier diseño) para el identificador y todas las vistas dentro de él son clickable.

 import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.SlidingDrawer; public class ClickableSlidingDrawer extends SlidingDrawer { private ViewGroup mHandleLayout; private final Rect mHitRect = new Rect(); public ClickableSlidingDrawer(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public ClickableSlidingDrawer(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onFinishInflate() { super.onFinishInflate(); View handle = getHandle(); if (handle instanceof ViewGroup) { mHandleLayout = (ViewGroup) handle; } } @Override public boolean onInterceptTouchEvent(MotionEvent event) { if (mHandleLayout != null) { int childCount = mHandleLayout.getChildCount(); int handleClickX = (int)(event.getX() - mHandleLayout.getX()); int handleClickY = (int)(event.getY() - mHandleLayout.getY()); Rect hitRect = mHitRect; for (int i=0;i<childCount;i++) { View childView = mHandleLayout.getChildAt(i); childView.getHitRect(hitRect); if (hitRect.contains(handleClickX, handleClickY)) { return false; } } } return super.onInterceptTouchEvent(event); } } 

Entonces, en su diseño .xml sólo use <my.package.name.ClickableSlidingDrawer> lugar de <SlidingDrawer>

Intenté la implementación de d4n3, pero como mi identificador contiene un botón que está anidado dentro de varios ViewGroup s, tuve que modificarlo para que funcione.

Mis implementaciones también supone que está utilizando un ViewGroup para el identificador, pero las vistas secundarias no tienen que ser clicables. Además, debe establecer la tag en " click_intercepted " de la vista (s) que desea que se pueda hacer clic en el identificador. Sólo las vistas secundarias con este conjunto de etiquetas específico se considerarán para los clics dentro del identificador. De esta manera, puede diseñar su manejador de cualquier manera que desee y seguir actuando apropiadamente en los clics en View específicas (por ejemplo, un Button ) en el identificador. Además, con esta implementación, todavía puede arrastrar y hacer clic en el identificador para alternar su estado.

 import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.SlidingDrawer; public class ClickableSlidingDrawer extends SlidingDrawer { private static final String TAG_CLICK_INTERCEPTED = "click_intercepted"; private ViewGroup mHandleLayout; private final Rect mHitRect = new Rect(); public ClickableSlidingDrawer(Context context, AttributeSet attrs) { super(context, attrs); } public ClickableSlidingDrawer(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onFinishInflate() { super.onFinishInflate(); View handle = getHandle(); if (handle instanceof ViewGroup) { mHandleLayout = (ViewGroup) handle; } } @Override public boolean onInterceptTouchEvent(MotionEvent event) { if (mHandleLayout != null) { int clickX = (int) (event.getX() - mHandleLayout.getLeft()); int clickY = (int) (event.getY() - mHandleLayout.getTop()); if (isAnyClickableChildHit(mHandleLayout, clickX, clickY)) { return false; } } return super.onInterceptTouchEvent(event); } private boolean isAnyClickableChildHit(ViewGroup viewGroup, int clickX, int clickY) { for (int i = 0; i < viewGroup.getChildCount(); i++) { View childView = viewGroup.getChildAt(i); if (TAG_CLICK_INTERCEPTED.equals(childView.getTag())) { childView.getHitRect(mHitRect); if (mHitRect.contains(clickX, clickY)) { return true; } } if (childView instanceof ViewGroup && isAnyClickableChildHit((ViewGroup) childView, clickX, clickY)) { return true; } } return false; } } 

En primer lugar hacer un diseño y poner su contenido Handle en él (por ejemplo, poner en handle_content.xml).

En segundo lugar, reemplace la manija de la handle actual con esto:

 <include android:id="@id/handle" android:layout="@layout/handle_content.xml"/> 

Ahora haga como abajo (digo esto porque abajo trabaje correctamente si u hace como arriba)

Esta es mi implementación:

 package com.examples.my.views; import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.widget.SlidingDrawer; import com.examples.my.MainFragmentActivity; public class MYSlidingDrawer extends SlidingDrawer { private View button; private int height; private MainFragmentActivity activity; public MYSlidingDrawer (Context context, AttributeSet attrs) { super(context, attrs); DisplayMetrics metrics = this.getResources().getDisplayMetrics(); height = metrics.heightPixels; } @Override public boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stub int left = button.getLeft(); int top = button.getTop(); int right = button.getRight(); int bottom = button.getBottom(); Rect rect = new Rect(left, top, right, bottom); int x = (int) event.getX(); int y = (int) event.getY(); if (isOpened()) { if (rect.contains(x, y)) { if (event.getAction() == MotionEvent.ACTION_UP) { if (activity != null) { //HERE DO YOUR WORK // Like activity.tooglePlay(); } } return true; } } else { y -= height; if (rect.contains(x, Math.abs(y))) { if (event.getAction() == MotionEvent.ACTION_UP) { if (activity != null) { //HERE DO YOUR WORK // Like activity.tooglePlay(); } } return true; } } return super.onTouchEvent(event); } public void setButton(View button) { this.button = button; } public void setActivity(MainFragmentActivity activity) { this.activity = activity; } } 

Y ahora definir esto en el que se incluye MYSlidingDrawer:

  MYSlidingDrawer drawer = (MYSlidingDrawer) findViewById(R.id.drawer); drawer.setActivity(this); Button btn = (Button) findViewById(R.id.play_btn);//button inside your handle drawer.setButton(btn); 

Espero que esto te ayude.

  • Eventos de ruta / burbuja de Android porque un control está consumiendo el evento onClick
  • Botón setonclicklistener error
  • Android se congela cuando hay una NullPointerException en OnClickListener.onClick (otras tareas no se pueden iniciar)
  • Cómo hacer clic o tocar en un texto de TextView
  • Evite que EditText consuma un evento de clic
  • Haga que un botón de Android cambie el fondo al hacer clic en XML
  • Android ListView con elementos que se pueden hacer clic en sus filas provoca problemas de desplazamiento continuo
  • Cómo configurar un spinner onClickListener () en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.