38

Tôi gặp vấn đề về bố cục khi kết hợp CoordinatorLayout với AppBarLayoutNavigationDrawer.CoordinatorLayout + AppBarLayout + NavigationDrawer

Vấn đề là, NavigationDrawer và nội dung của nó được ẩn đằng sau thanh công cụ. Tôi đã làm rất nhiều nghiên cứu và đã cố gắng rất nhiều trong việc tái cơ cấu, nhưng không có giải pháp nào "" giải quyết được vấn đề của tôi.

Một cuộc biểu tình có thể được tìm thấy trong ít webm video này: https://goo.gl/yWj3VM

Phong cách cơ bản là Theme.AppCompat.Light.NoActionBar.

My activity_overview.xml trông như thế này:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/overview_coordinator_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.design.widget.AppBarLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 


     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:background="?attr/colorPrimaryDark" 
      app:layout_scrollFlags="enterAlways|scroll" /> 


    </android.support.design.widget.AppBarLayout> 

    <android.support.v4.widget.DrawerLayout 
     android:id="@+id/drawer_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:clickable="true" 
     android:focusableInTouchMode="true"> 

     <android.support.v4.widget.NestedScrollView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

      <TextView 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:text="@string/lorem_ipsum_long" /> 
     </android.support.v4.widget.NestedScrollView> 

     <android.support.design.widget.NavigationView 
      android:id="@+id/nvView" 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" 
      android:layout_gravity="start" 
      android:background="@android:color/white" 
      app:headerLayout="@layout/nav_header" 
      app:menu="@menu/navigationdrawer_main" /> 

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


    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/overview_floating_action_button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_margin="16dp" 

     android:clickable="true" 
     android:src="@drawable/ic_add" 
     app:layout_anchor="@id/overview_coordinator_layout" 
     app:layout_anchorGravity="bottom|right|end" 
     app:layout_behavior="@string/fab_onscroll_behavior" /> 

</android.support.design.widget.CoordinatorLayout> 

Trả lời

71

CoordinatorLayout của bạn được gói DrawerLayout và NavigationView của bạn, có nghĩa là Điều phối viên đang kiểm soát như thế nào tất cả mọi thứ được sắp xếp. Bạn cần lồng tổ chức Điều phối viên vào ngăn kéo, như vậy:

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

    <android.support.design.widget.CoordinatorLayout 
     xmlns:app="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/overview_coordinator_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

     <android.support.design.widget.AppBarLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 


      <android.support.v7.widget.Toolbar 
       android:id="@+id/toolbar" 
       android:layout_width="match_parent" 
       android:layout_height="?attr/actionBarSize" 
       android:background="?attr/colorPrimaryDark" 
       app:layout_scrollFlags="enterAlways|scroll" /> 

     </android.support.design.widget.AppBarLayout> 

     <android.support.v4.widget.NestedScrollView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

      <TextView 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:text="@string/lorem_ipsum_long" /> 

     </android.support.v4.widget.NestedScrollView> 

     <android.support.design.widget.FloatingActionButton 
      android:id="@+id/overview_floating_action_button" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_margin="16dp" 
      android:clickable="true" 
      android:src="@drawable/ic_add" 
      app:layout_anchor="@id/overview_coordinator_layout" 
      app:layout_anchorGravity="bottom|right|end" 
      app:layout_behavior="@string/fab_onscroll_behavior" /> 

    </android.support.design.widget.CoordinatorLayout> 

    <android.support.design.widget.NavigationView 
     android:id="@+id/nvView" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="start" 
     android:background="@android:color/white" 
     app:headerLayout="@layout/nav_header" 
     app:menu="@menu/navigationdrawer_main" /> 

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

Điều đó nên sắp xếp!

+1

Làm việc cho tôi nhờ – sector11

+0

Nhưng điều này phá vỡ giao diện người dùng Snackbar nếu bạn cố gắng thêm một điều như vậy ... – slott

+0

@slott How are you thấy một? Tôi đã không rối tung xung quanh với họ, nhưng liên kết này dường như chỉ ra rằng bạn cần phải đính kèm một id cho điều phối viên và sau đó vượt qua đó trong khi xem khi bạn thực hiện các snackbar: https://developer.android .com/tham khảo/android/hỗ trợ/thiết kế/widget/Snackbar.html # make (android.view.View, int, int) – GeordieMatt

6

Để thêm vào câu trả lời trước, bạn có thể làm cho trình dọn dẹp DrawerLayout bằng cách di chuyển phần tử CoordinatorLayout + child thành tệp xml riêng biệt. Và sau đó chỉ cần sử dụng tùy chọn "bao gồm" để thêm tệp.

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/drawer_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true" 
tools:openDrawer="start"> 

    <!-- Widget Coordinator + child elements go here --> 
    <include 
    layout="@layout/app_bar_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

    <android.support.design.widget.NavigationView 
    android:id="@+id/nav_view" 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:layout_gravity="start" 
    android:fitsSystemWindows="true" 
    app:headerLayout="@layout/nav_header_main" 
    app:menu="@menu/activity_main_drawer" /> 

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

Xin chào. Hầu hết thời gian, tôi sử dụng ngăn kéo làm bố cục cho một hoạt động, và sau đó chỉ cần tải một mảnh vào FrameLayout, nơi bạn đã có bao gồm của bạn. Có nghĩa là tôi có thể sử dụng hoạt động để xử lý tất cả điều hướng dựa trên ngăn kéo của mình. – GeordieMatt

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