2010-04-07 8 views
15

Tengo un SlidingDrawer que aparece desde la parte inferior de la pantalla y llena la pantalla alrededor del 80%. Aunque la vista SlidingDrawer está enfocada, todavía es posible hacer clic en elementos, botones y otros elementos en la vista que está detrás de SlidingDrawer. Cuando SlidingDrawer está activo/detenido/en foco, quiero deshabilitar toda la vista detrás de él para que no pueda recibir clics y toques. ¿Hay una buena manera de desactivar una vista completa? He intentado setEnable (falso) y setClickable (falso) pero ninguno de ellos funciona.¿Cómo puedo desactivar una vista detrás de mi SlidingDrawer en Android?

¿Ayuda?

+0

utilizo cajón deslizante también, pero nunca tuvo este problema ^^ –

+0

Te diste cuenta de esto ¿uno fuera? Teniendo el mismo problema –

+0

http://stackoverflow.com/questions/5393314/android-slidingdrawer-doesnt-disable-buttons-under-the-drawer?lq=1 – Mertuarez

Respuesta

12

He aquí una forma de evitar este problema (también necesitaba una solución): tome el linearLayout que contiene los contenidos y agregue un oyente de clic. Haga que el oyente clic responda a los clics (deseche, lo que sea) - y esto luego lo detiene propagándose a la vista debajo del cajón deslizante - funciona para mí - y no bloquea los otros elementos en el cajón.

+0

+1 Esto funciona muy bien. ¡Gracias! – flumpb

+0

Trabajo, gran jugaad –

+0

Esto equivale a lo que @mansukh dice a continuación, pero su camino es menos código. – Elemental

1

La respuesta de Joe no fue el truco para mí. Mi escenario es un poco diferente. Tengo un FrameLayout con dos niños. Solo uno de los niños tiene que estar "activo" en un momento dado, y mientras el segundo está activo, el primero ya no debe procesar ninguna entrada. Mi solución:

public static void changeVGstate(ViewGroup current, boolean enable) 
{ 
    current.setFocusable(enable); 
    current.setClickable(enable); 
    current.setEnabled(enable); 

    for (int i = 0; i < current.getChildCount(); i++) 
    { 
     View v = current.getChildAt(i); 
     if (v instanceof ViewGroup) 
      changeVGstate((ViewGroup)v, enable); 
     else 
     { 
      v.setFocusable(enable); 
      v.setClickable(enable); 
      v.setEnabled(enable); 
     } 
    } 
} 

Enjoy!

2

He intentado poner SlidingDrawer en el RelativeLayout, en lugar de LinearLayout. Y configure mySlidingDrawer.bringToFront() en el método de apertura.

Así que creo que esto puede ser una solución.

2

En qué lado Disposición android:clickable="true"

por ejemplo después de archivo es drawer.xml

Dentro LinearLayoutandroid:id="@+id/drawer_view"clickable="true"

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:id="@+id/drawer_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     tools:context=".MainActivity"> 


     <FrameLayout 
      android:id="@+id/container" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 

     </FrameLayout>  

     <LinearLayout 
      android:id="@+id/drawer_view" 
      android:layout_width="@dimen/navigation_drawer_width" 
      android:layout_height="match_parent" 
      android:orientation="vertical" 
      android:layout_gravity="start" 
      android:clickable="true" 
      android:background="@color/drawer_background"> 

      <LinearLayout 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:padding="10dp" 
       android:background="@drawable/order_list_selector" 
       android:orientation="horizontal"> 

       <ImageView 
        android:layout_width="@dimen/user_image_w_h" 
        android:layout_height="@dimen/user_image_w_h" 
        android:scaleType="fitCenter" 
        android:id="@+id/drawerUserImage" 
        android:src="@drawable/ic_user_icon" 
        android:layout_gravity="center_vertical" /> 

       <LinearLayout 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:gravity="center" 
        android:layout_gravity="center_vertical" 
        android:orientation="vertical" 
        android:layout_marginLeft="5dp" 
        android:padding="5dp"> 

        <TextView 
         android:id="@+id/drawerUserNameTextView" 
         android:layout_width="match_parent" 
         android:layout_height="wrap_content" 
         android:text="Mansukh Ahir" 
         android:textColor="@android:color/black" 
         android:textSize="@dimen/font_large" /> 

        <TextView 
         android:id="@+id/drawerEmailIdTextView" 
         android:layout_width="match_parent" 
         android:layout_height="wrap_content" 
         android:textSize="@dimen/font_very_small"/> 
       </LinearLayout> 
      </LinearLayout> 

      <View 
       android:layout_width="fill_parent" 
       android:layout_height="1dp" 
       android:background="@color/holo_gray_light" /> 

      <ListView 
       android:id="@+id/drawerListSlideMenu" 
       android:layout_width="wrap_content" 
       android:layout_height="fill_parent" 
       android:choiceMode="singleChoice" 
       android:dividerHeight="1dp" /> 
     </LinearLayout> 

    </android.support.v4.widget.DrawerLayout> 
+0

En mi opinión, esta es la solución más fácil y directa para los diseños que se 'cubren' mutuamente: esto hace que el fondo de la página de cobertura 'absorba' el clic en lugar de pasarlo. – Elemental

+1

porque no puedo anular el método 'SwipeRefreshLayout'' canChildScrollUp() 'por eso utilizo esta solución. –

Cuestiones relacionadas