8

Trong ứng dụng này tôi đang xây dựng, tôi đã thêm một ngăn ngăn điều hướng vào hoạt động của mình. Tôi đang sử dụng 5.0, vì vậy tôi đã có thể đặt primaryColor và primaryColorDark để có được màu sắc phù hợp. Tôi đã quyết định thử và phong cách ngăn kéo Nav của tôi rất giống với ngăn kéo của Google Hiện hành ở 5.0, trong đó ngăn kéo Nav có nền riêng cho thanh trạng thái. (Không thể đăng ảnh, không đủ danh tiếng>.>)Thanh trạng thái màu tô màu trong ngăn kéo Nav

Tôi đã làm theo các đề xuất của câu hỏi này here, điều này đã giúp khá nhiều. Tôi đã đạt được vẽ ngăn kéo Nav của tôi dưới thanh trạng thái khi tôi kéo nó ra. Chỉ có rắc rối là, tôi không thể tìm ra cách để thiết lập màu sắc của thanh trạng thái hiển thị trong ngăn kéo của tôi. Hiện tại, nó chỉ hiển thị màu trắng.

Dưới đây là các bit có liên quan của phong cách và mã của tôi:

Hoạt động Giao diện:

<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" 
    tools:context=".Main" 
    android:fitsSystemWindows="true"> 

    <!-- main content --> 
    ... 

    <!-- Drawer fragment --> 
    <fragment 
     android:id="@+id/navigation_drawer" 
     android:layout_width="@dimen/navigation_drawer_width" 
     android:layout_height="match_parent" 
     android:layout_gravity="left|start" 
     android:theme="@style/DrawerTheme" 
     android:fitsSystemWindows="true" 
     android:choiceMode="singleChoice" 
     android:name="com.myname.appname.NavigationDrawerFragment" 
     tools:layout="@layout/fragment_navigation_drawer" /> 

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

Fragment Layout:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/navDrawerFragment" 
    android:theme="@style/DrawerTheme" 
    android:background="@color/WindowBackground" 
    tools:context=".NavigationDrawerFragment" 
    android:fitsSystemWindows="true"> 

    <!-- content here --> 

</RelativeLayout> 

mỗi liên kết ở trên, thiết lập màu sắc của thanh trạng thái của tôi cho hoạt động (phần này hoạt động chính xác):

public void onCreate(Bundled savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // .... 

    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
    drawerLayout.setDrawerShadow(R.drawable.drawer_shadow, Gravity.START); 
    drawerLayout.setStatusBarBackgroundColor(getResources().getColor(R.color.colorPrimaryDark)); 

    // .... 
} 

Và cuối cùng, phong cách liên quan của tôi cho hoạt động và những gì tôi đã cố gắng chỉ định cho đoạn.

<style name="StatusBarActivityTheme" parent="MyAppTheme"> 
    <item name="android:windowDrawsSystemBarBackgrounds">true</item> 
    <item name="android:statusBarColor">@android:color/transparent</item> 
</style> 


<style name="DrawerTheme" parent="MyAppTheme"> 
    <item name="android:statusBarColor">#000000</item> 
    <item name="android:colorPrimaryDark">#000000</item> 
    <item name="android:windowDrawsSystemBarBackgrounds">true</item> 
</style> 

Cảm ơn trước sự giúp đỡ của bạn! Tôi nghi ngờ vấn đề của tôi liên quan đến cách màn hình chính của Google Hiện hành có thanh trạng thái trong suốt và chỉ có màu sắc trong Ngăn điều hướng, nhưng mọi tin tức ngược lại đều tuyệt vời!

+0

R.color.colorPrimaryDark đang tham chiếu giá trị màu từ XML ứng dụng của bạn, không phải thuộc tính chủ đề android: colorPrimaryDark. Bạn đã định nghĩa @ color/colorPrimaryDark như trong tệp res của bạn? – alanv

+0

Tôi đã xác định @ color/colorPrimaryDark thành màu hex, không thể nghĩ về nó trên đầu của tôi. Phần đó đang hoạt động - nó tô màu chính xác thanh trạng thái của hoạt động (drawerlayout). Tôi quan tâm hơn đến ngăn kéo mảnh. (Tôi thực sự muốn tôi có thể đăng một số ảnh chụp màn hình, nhưng đây là bài đăng đầu tiên của tôi ...) – Andrew

+0

DrawerLayout.setStatusBarBackgroundColor() là lời gọi phương thức chính xác để đặt màu thanh trạng thái của ngăn kéo. Bạn không cần phải thiết lập một chủ đề đặc biệt trên đó. GetResources(). GetColor (R.color.colorPrimaryDark) có chuyển sang màu trắng không? – alanv

Trả lời

17

Với thiết lập bạn có, Ngăn kéo điều hướng chỉ đơn giản là chế độ xem vẽ nền (mà bạn đã xác định là android:background="@color/WindowBackground") bên dưới thanh trạng thái (màu bạn đã đặt trong suốt qua StatusBarActivityTheme). Hệ thống chỉ trông giống như chủ đề Hoạt động để đặt màu thanh trạng thái; chỉ định android:statusBarColor cho một đứa trẻ không có hiệu lực.

Giải pháp đơn giản sẽ là thay đổi bố cục phân đoạn ngăn kéo Nav Drawer của bạn android:background thành màu bạn muốn. Nếu bạn muốn phần dưới hình ảnh của bạn vẫn còn màu trắng, một tùy chọn sẽ là sau đó thêm Chế độ xem trống trong bố cục ngăn kéo của bạn với android:background="@color/WindowBackground" hoặc một số màu khác.


Nếu bạn mong muốn cho các nội dung trong Nav Drawer của bạn để mở rộng bên dưới thanh trạng thái, nó đòi hỏi làm việc nhiều hơn một chút. Lý do nó được bù đắp để bắt đầu với là vì bạn đặt thuộc tính android:fitsSystemWindows thành true, do đó gọi số mặc định là fitSystemWindows() của chế độ xem. Khi tài liệu giải thích, phương thức này lấy inset (nghĩa là chiều cao của thanh trạng thái trong trường hợp của chúng ta) và áp dụng nó như padding của khung nhìn (trong trường hợp của bạn, điều này trở thành phần đệm đầu cho RelativeLayout của đoạn ngăn kéo Nav Drawer).

Một cách để vượt qua đệm này là ghi đè phương thức fitSystemWindows() của chế độ xem. Tôi hướng dẫn bạn đến ứng dụng Lịch IO nguồn mở của Google - cụ thể là họ đã sử dụng ScrimInsetsScrollView làm phần tử gốc trong số Nav Drawer của mình.Sửa đổi ScrollView này áp dụng hình ảnh màu của sự lựa chọn của bạn (được đặt thông qua thuộc tính tùy chỉnh app:insetForeground) và tiêu thụ hình chữ nhật, nghĩa là không có thêm phần đệm!

ScrimInsetsScrollView có thể được sử dụng làm mô hình để viết phiên bản của riêng bạn cho bất kỳ hậu duệ nào của Chế độ xem, thực sự - xem phần cuối giống hệt nhau ScrimInsetsFrameLayout.

+1

Cảm ơn! Tôi muốn upvote câu trả lời, nhưng tôi đã chỉ có 3 đại diện vẫn còn. – Andrew

+0

Cảm ơn bạn đã giải thích về cách hoạt động! – aluxian

+0

Cảm ơn, tôi đã cập nhật nền của chế độ xem gốc của trình điều hướng ngăn xếp và nó hoạt động :) – Peter

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