2013-08-23 12 views
6

Uso DrawerLayout e di recente voglio modificare la gravità di listView in drawerLayout. Ma dopo che ho cambiare la gravità di listView a android:layout_gravity="start|bottom" da android:layout_gravity="start", drawerLayout non può essere blocco perPerché non riesco a bloccare DrawerLayout con gravità layout

mDrawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 

setDrawerLockMode() lavorare;

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

Ma non si blocca con;

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

`

Degli indizi su Perché non è possibile utilizzare la modalità di blocco con altri gravità?

Grazie!

risposta

16

Sulla base del documentation, gli unici gravità disponibili che possono essere utilizzati sono Gravity.LEFT, Gravity.RIGHT o GravityCompat.START, GravityCompat.END.

(sottolineatura mia):

posizionamento e la layout cassetto è controllata usando l' attributo android: layout_gravity sulle viste bambino corrispondenza del quale lato della visualizzazione si desidera che il cassetto di emergere da: sinistra oppure a destra. (O di inizio/fine su versioni della piattaforma che supportano direzione layout.)

Guardando il 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 
    } 
} 

Il metodo si controlla solo se la gravità è LEFT o RIGHT (ma usa un Metodo GravityCompat, quindi START e END devono essere tradotti in modo appropriato).

Ciò significherebbe che impostando una gravità di "start|bottom", si introduce una gravità non valida, che fa sì che setDrawerLockMode() non faccia nulla.

+2

Grazie. Ho già risolto questo problema aggiungendo la visualizzazione elenco in un altro layout. Ma questo codice spiega la mia domanda. –

+0

Prego! Congratulazioni per trovare un'alternativa a ciò che volevi ottenere :-) –

+0

Risposta corretta, ma dovrebbero anche supportare 'END' e' START' –