2015-02-12 10 views

Antwort

7

Es gibt ein paar Dinge, die Sie tun müssen:

  1. das Layout deaktivieren durch Schwund eine transparente Farbeinstellung:

    drawer.setScrimColor(Color.TRANSPARENT); 
    
  2. Schublade verriegeln

    drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_OPEN); 
    
  3. eine benutzerdefinierte Schublade Klasse erstellen, die das versehentliche Modus Sie suchen erlaubt:

    public class CustomDrawer extends DrawerLayout { 
    
        public CustomDrawer(Context context) { 
         super(context); 
        } 
    
        public CustomDrawer(Context context, AttributeSet attrs) { 
         super(context, attrs); 
        } 
    
        public CustomDrawer(Context context, AttributeSet attrs, int defStyle) { 
         super(context, attrs, defStyle); 
        } 
    
        @Override 
        public boolean onInterceptTouchEvent(MotionEvent ev) { 
         View drawer = getChildAt(1); 
    
         if (getDrawerLockMode(drawer) == LOCK_MODE_LOCKED_OPEN && ev.getRawX() > drawer.getWidth()) { 
          return false; 
         } else { 
          return super.onInterceptTouchEvent(ev); 
         } 
        } 
    
    } 
    
  4. Verwenden Sie diese Klasse in xml:

    <com.example.myapplication.CustomDrawer 
        xmlns:android="http://schemas.android.com/apk/res/android" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent"> 
    
        <FrameLayout 
         android:layout_width="match_parent" 
         android:layout_height="match_parent"> 
         <!-- The main content view --> 
        </FrameLayout> 
        <ListView android:layout_width="100dp" 
           android:layout_height="match_parent" 
           android:layout_gravity="start" 
           android:background="#111"/> 
    </com.example.myapplication.CustomDrawer> 
    
+0

Danke, das funktioniert ein. –

+0

Können Sie immer noch auf die Elemente in Ihrer Schublade klicken, da sie für den gesamten Bildschirm den Wert false zurückgibt? – Quanturium

+0

@Quanturium für das müssen Sie überprüfen, ob die Berührung sogar auf dem ListView durchgeführt wird oder nicht. Mein Code wurde entsprechend aktualisiert. – Simas

2

Dies ist eine schwierige Sache. Wenn die Schublade geöffnet ist, fängt sie Ihre Berührungsereignisse ab, die das Schließen der Schublade auslösen. Um das zu verhindern, müssen Sie Ihre DrawerLayout und überschreiben die onInterceptTouchEvent Methode Unterklasse:

public class CustomDrawerLayout extends DrawerLayout 
{ 
    private View rightView; 
    private int mTouchSlop; 

    public CustomDrawerLayout (Context context) 
    { 
     this(context, null); 
    } 

    public CustomDrawerLayout (Context context, AttributeSet attrs) 
    { 
     this(context, attrs, 0); 
    } 

    public CustomDrawerLayout (Context context, AttributeSet attrs, int defStyle) 
    { 
     super(context, attrs, defStyle); 
     mTouchSlop = ViewConfigurationCompat.getScaledPagingTouchSlop(ViewConfiguration.get(context)); 
    } 

    public void setRightView (View v) 
    { 
     this.rightView = v; 
    } 

    @Override 
    public boolean onInterceptTouchEvent (MotionEvent ev) 
    { 
     boolean result = super.onInterceptTouchEvent(ev); 

     if (rightView != null && isDrawerOpen(rightView)) 
     { 
      DrawerLayout.LayoutParams layoutParams = (DrawerLayout.LayoutParams) rightView.getLayoutParams(); 

      if (layoutParams.gravity == Gravity.END) 
      { 
       // This is true when the position.x of the event is happening on the left of the drawer (with gravity END) 
       if (ev.getX() < rightView.getX() && ev.getX() > mTouchSlop) 
       { 
        result = false; 
       } 
      } 
     } 

     return result; 
    } 
} 

Dies ist mein Code mit einem rechten Schublade arbeiten. Ich bin mir sicher, dass du das für deine linke Schublade anpassen kannst. Vielleicht haben Sie auch den Schatten deaktivieren:

mDrawerLayout.setScrimColor(Color.TRANSPARENT); 
Verwandte Themen