2013-08-23 32 views
6

Używam DrawerLayout i ostatnio chcę zmienić grawitację listView w drawerLayout. Ale po zmianie wagi ListView do android:layout_gravity="start|bottom" z android:layout_gravity="start", drawerLayout nie może być blokada naDlaczego nie mogę zablokować DrawerLayout z grawitacją układu

mDrawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 

setDrawerLockMode() pracować;

<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" > 

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 
</RelativeLayout> 

<ListView 
    android:id="@+id/drawer_list" 
    android:layout_width="320dp" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:background="#F3F3F4" 
    android:choiceMode="singleChoice" > 
</ListView> 

Ale nie zablokować;

<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" > 

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 
</RelativeLayout> 

<ListView 
    android:id="@+id/drawer_list" 
    android:layout_width="320dp" 
    android:layout_height="match_parent" 
    android:layout_gravity="start|bottom" 
    android:background="#F3F3F4" 
    android:choiceMode="singleChoice" > 
</ListView> 

`

Wszelkie wskazówki o dlaczego nie mogę korzystać z trybu blokady z innymi grawitacjach?

Dzięki!

Odpowiedz

16

podstawie documentation, że tylko dostępne grawitacjach, które mogą być stosowane są Gravity.LEFT, Gravity.RIGHT lub GravityCompat.START, GravityCompat.END.

(Kopalnia nacisk):

pozycjonowania szuflady i układ jest sterowany za pomocą android: atrybut layout_gravity na widoków podrzędnych odpowiada który stronie widoku chcesz szuflada wyjdzie z: lewo lub prawo. (Lub start/koniec w wersjach platform obsługujących kierunek układu.)

Patrząc na source code

public void setDrawerLockMode(int lockMode, int edgeGravity) { 
    final int absGrav = GravityCompat.getAbsoluteGravity(edgeGravity, 
                 ViewCompat.getLayoutDirection(this)); 
    if (absGrav == Gravity.LEFT) { 
    mLockModeLeft = lockMode; 
    } else if (absGrav == Gravity.RIGHT) { 
    mLockModeRight = lockMode; 
    } 
    if (lockMode != LOCK_MODE_UNLOCKED) { 
    // Cancel interaction in progress 
    final ViewDragHelper helper = absGrav == Gravity.LEFT ? mLeftDragger : mRightDragger; 
    helper.cancel(); 
    } 
    switch (lockMode) { 
    case LOCK_MODE_LOCKED_OPEN: 
     final View toOpen = findDrawerWithGravity(absGrav); 
     if (toOpen != null) { 
     openDrawer(toOpen); 
     } 
     break; 
    case LOCK_MODE_LOCKED_CLOSED: 
     final View toClose = findDrawerWithGravity(absGrav); 
     if (toClose != null) { 
     closeDrawer(toClose); 
     } 
     break; 
     // default: do nothing 
    } 
} 

sama metoda sprawdza tylko, czy grawitacja jest LEFT lub RIGHT (ale używa GravityCompat metoda, więc START i END powinny być odpowiednio przetłumaczone).

To oznaczałoby, że ustawiając wagę "start|bottom", wprowadzasz nieważną grawitację, która powoduje, że setDrawerLockMode() nic nie robi.

+2

Dzięki. Naprawiłem już ten problem dodając widok listy do innego układu. Ale ten kod wyjaśnia moje pytanie. –

+0

Nie ma za co! Gratulujemy znalezienia alternatywy dla tego, co chcesz osiągnąć :-) –

+0

Prawidłowa odpowiedź, ale powinny również obsługiwać "KONIEC" i "START" –