5

Tôi muốn xóa paddingTop/marginTop khỏi chế độ xem điều hướng ở chế độ Nhiều cửa sổ của Android N. Như Gmail đã làm. Nếu bạn nhìn thấy hình ảnh dưới đây, tôi đang nói về padding bình thường với kích thước bằng với thanh trạng thái ở đầu giao diện điều hướng.Xóa phần đệm trên cùng của chế độ xem điều hướng trong chế độ nhiều cửa sổ Android

enter image description here

Vì vậy, về cơ bản trong chế độ Multi-Window (xem hình dưới đây) tôi phải loại bỏ đệm rằng khi ứng dụng của tôi là trong phần thứ hai của màn hình.

enter image description here

Đáng tiếc là từ api mới 24 bạn có isInMultiWindowMode() nhưng nó không thể biết trong đó một phần của màn hình là ứng dụng của bạn.

Trả lời

2

Thay vì cố gắng tìm hiểu xem bạn có đang ở chế độ nhiều cửa sổ hay không và trên phần nào của màn hình, bạn cần đặt tiêu đề chế độ xem của tiêu đề chế độ xem của cửa sổ điều hướng.

Thông thường bạn chỉ quan tâm đến một cửa sổ - ứng dụng mà ứng dụng của bạn được vẽ. Thông thường bạn thậm chí không nghĩ có bất kỳ cửa sổ nào. Ứng dụng của bạn có được vẽ toàn màn hình không? Vâng, thực sự là không. Thông thường có một số không gian dành riêng cho thanh hệ thống, như thanh trạng thái ở trên cùng và thanh điều hướng ở dưới cùng. Chúng được vẽ trong các cửa sổ riêng biệt - các cửa sổ hệ thống. (Oh, và bây giờ chúng tôi đã có chế độ nhiều cửa sổ ở N. Giống như chế độ nhiều cửa sổ ứng dụng, bởi vì nếu bạn đếm các cửa sổ hệ thống thì nhiều cửa sổ đã được đặt trong một khoảng thời gian.)

Bạn có thể thực hiện tiêu đề xem điều hướng của bạn điều chỉnh insets của nó tùy thuộc vào việc nó nằm trong một cửa sổ hệ thống (trong trường hợp này là: thanh trạng thái) hay không chỉ với một vài tinh chỉnh đơn giản.

Giả giao diện điều hướng được định nghĩa như thế:

<android.support.design.widget.NavigationView 
    ... 
    android:fitsSystemWindows="true" 
    app:headerLayout="@layout/nav_header_main" 
    ... /> 

và có một bố trí tiêu đề đơn giản trong nav_header_main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="@dimen/nav_header_height" 
    android:background="@drawable/nav_header_background" 
    android:orientation="vertical" 
    android:paddingBottom="16dp" 
    android:paddingLeft="16dp" 
    android:paddingRight="16dp" 
    android:paddingTop="32dp"> 

    <ImageView 
     android:id="@+id/imageView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@android:drawable/default_profile_picture" /> 

    ... 

</LinearLayout> 

bạn chỉ cần thay đổi nó như thế:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="@dimen/nav_header_height" 
    android:background="@drawable/nav_header_background" 
    android:fitsSystemWindows="true" 
    android:orientation="vertical"> 

    <ImageView 
     android:id="@+id/imageView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@android:drawable/sym_def_app_icon" 
     android:layout_marginLeft="16dp" 
     android:layout_marginRight="16dp" 
     android:layout_marginTop="8dp"/> 

    ... 

</LinearLayout> 
  1. Trước tiên, bạn cần thêm android:fitsSystemWindows="true" vào bố cục.
  2. Bây giờ, bạn cần tạo phần đệm trên cùng nhỏ hơn, vì fitsSystemWindows sẽ tự động thêm phần đệm của thanh trạng thái. Vì vậy, trước đây padding hàng đầu của bạn là từ đầu của tiêu đề của bạn, bây giờ nó chỉ là từ dưới cùng của thanh trạng thái.
  3. Và bạn phải di chuyển tất cả các phần đệm từ bố trí ở một nơi khác (ví dụ: tôi đã chuyển chúng sang lề trên các chế độ xem con), vì fitsSystemWindows sẽ ghi đè các phần đệm đó.

Sau này nếu ứng dụng của bạn ở phần dưới cùng của chia nhiều cửa sổ thì phần đệm cho thanh trạng thái sẽ không được thêm. Nó cũng sẽ làm cho giao diện điều hướng của bạn trông đúng trong bất kỳ trường hợp nào khác mà nó không nằm trong thanh trạng thái hoặc nếu thanh trạng thái thay đổi kích thước trong bất kỳ phiên bản Android nào trong tương lai hoặc một số ROM tùy chỉnh điên.

+0

Tôi nghĩ android: fitsSystemWindows = "true" trong NavigationView là đủ. Thêm android: fitsSystemWindows cũng trong bố cục tiêu đề sẽ khắc phục sự cố. Cảm ơn – br00

+0

Tôi vừa phát hiện ra rằng giải pháp này chỉ hoạt động cho api 24+ – br00

0

Đối với tôi không có gì đang làm việc vì vậy tôi đã kết thúc đi tuyến đường này và nó đã hoàn thành công việc:

<android.support.design.widget.NavigationView 
    ... 
    app:insetForeground="@null"/> 

Về mặt kỹ thuật, các insets là vẫn còn hiện diện nhưng kể từ khi tài nguyên insetForeground sử dụng để vẽ trên chúng ngay bây giờ là null , rằng logic is skipped in ScrimInsetsFrameLayout's onDraw method (là lớp cha của NavigationView).

Vì vậy, khi mọi thứ khác không thành công, đây là một tuyến khá hiệu quả.

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