2013-08-23 23 views
6

Tôi sử dụng DrawerLayout và gần đây tôi muốn thay đổi trọng lực của listView trong drawerLayout. Nhưng sau khi tôi thay đổi lực hấp dẫn của ListView để android:layout_gravity="start|bottom" từ android:layout_gravity="start", DrawerLayout không thể khóa đểTại sao tôi không thể khóa DrawerLayout với bố cục trọng lực

mDrawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); 

setDrawerLockMode() làm việc với;

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

Nhưng nó không khóa với;

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

'

Bất kỳ manh mối về việc tại sao tôi không thể sử dụng chế độ khóa với trọng lực khác?

Cảm ơn!

Trả lời

16

Dựa trên documentation, các chỉ trọng lực có sẵn mà có thể được sử dụng là Gravity.LEFT, Gravity.RIGHT hoặc GravityCompat.START, GravityCompat.END.

(tôi nhấn mạnh):

Drawer vị trí và bố trí được điều khiển bằng cách sử dụng android: attribute layout_gravity trên quan điểm con tương ứng mà bên lề giao diện bạn muốn ngăn nổi lên từ: trái hoặc ngay. (Hoặc bắt đầu/kết thúc trên các phiên bản nền tảng có hỗ trợ hướng bố trí.)

Nhìn vào 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 
    } 
} 

Phương pháp riêng của mình chỉ kiểm tra xem mức độ nghiêm trọng là LEFT hoặc RIGHT (nhưng sử dụng một Phương pháp GravityCompat, vì vậy, STARTEND phải được dịch một cách thích hợp).

Điều này có nghĩa là bằng cách đặt trọng số là "start|bottom", bạn đang giới thiệu một lực hấp dẫn không hợp lệ, gây ra setDrawerLockMode() không làm gì cả.

+2

Cảm ơn. Tôi đã khắc phục sự cố này khi thêm chế độ xem danh sách vào một bố cục khác. Nhưng mã này giải thích câu hỏi của tôi. –

+0

Bạn được chào đón! Xin chúc mừng bạn đã tìm kiếm giải pháp thay thế cho những gì bạn muốn đạt được :-) –

+0

Câu trả lời đúng, nhưng họ cũng nên hỗ trợ 'END' và' START' –

Các vấn đề liên quan