2013-12-14 22 views
23

Tôi đang thử nghiệm với thanh điều hướng mờ Android 4.4 mới và muốn đặt thanh điều hướng làm mờ bằng cách sử dụng cờ FLAG_TRANSLUCENT_NAVIGATION. Tôi chỉ muốn thanh điều hướng (mặt sau, nút trang chủ, v.v.) bị mờ - Tôi muốn thanh trạng thái ở đầu màn hình xuất hiện bình thường I.e. KHÔNG mờ.Đảm bảo độ cao của thanh trạng thái để giải quyết vấn đề điều hướng mờ KitKat

Mã Tôi đang sử dụng để đạt được điều này là:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
    Window w = getWindow(); 
    w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION); 
} 

Vấn đề tôi có là Android bây giờ nghĩ rằng các hoạt động là toàn màn hình và đặt cách bố trí đằng sau thanh điều hướng (đó là chính xác), tiếc là nó cũng đặt bố trí phía sau thanh trạng thái (một vấn đề).

Sửa lỗi cho điều này sẽ là áp dụng một phần đệm vào đầu bố cục gốc bố cục, tuy nhiên tôi cần xác định chiều cao của thanh trạng thái để thực hiện việc này.

Bất kỳ ai cũng có thể đề xuất cách tôi nhận được chiều cao của thanh trạng thái, nó không tầm thường như tôi nghĩ, hoặc cách khác là đề xuất giải pháp thích hợp.

Cảm ơn

+0

Xin chào Milo, tôi đang đối mặt với cùng một vấn đề ở đây. Tôi đã cố gắng workaround này, nhưng Layout của tôi giữ phía sau ActionBAr của tôi. Tôi đã thêm phần đệm trên vào bố cục gốc nhưng tôi nghĩ chiều cao của Thanh trạng thái là không đủ, bạn có gặp vấn đề tương tự không? Tôi cần phải thiết lập một padding hàng đầu cho cả hai heigths? – noni

+0

Noni, tôi nhận được chế độ xem gốc của Hoạt động như sau: getWindow(). GetDecorView(). FindViewById (android.R.id.Nội dung); Sau đó tôi áp dụng padding I.e. setPadding (0, statusBarHeight, 0, 0); Hy vọng điều đó sẽ hữu ích. – Milo

Trả lời

54
public int getStatusBarHeight() { 
     int result = 0; 
     int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); 
     if (resourceId > 0) { 
      result = getResources().getDimensionPixelSize(resourceId); 
     } 
     return result; 
} 

Sử dụng các mã trên trong phương thức onCreate. Đặt nó trong một lớp contextWrapper. http://mrtn.me/blog/2012/03/17/get-the-height-of-the-status-bar-in-android/

+0

Điều này dường như không hoạt động, bạn có biết điều này có hoạt động trên mọi phiên bản Android 4.1 trở lên không? Tôi nhớ đọc giải pháp này có thể không hoạt động trên máy tính bảng Transformer, nó làm cho tôi tự hỏi, nếu điều này sẽ thất bại trên các thiết bị khác quá? – Milo

+0

chỉ dành cho máy tính bảng biến áp theo như tôi biết. Hoạt động tốt trên các thiết bị khác mà tôi đã thử nghiệm. Và đừng quên chấp nhận và upvote. cổ vũ – user2511882

+1

Thật đáng tiếc là không có phương pháp đáng tin cậy để có được chiều cao của thanh trạng thái trên mọi thiết bị. Điều đó nói rằng, nó sẽ phải làm ngay bây giờ. – Milo

3

Chiều cao của thanh điều hướng dưới cùng là 48dp (ở cả chế độ dọc và ngang) và là 42dp khi thanh được đặt theo chiều dọc.

Hy vọng điều này sẽ hữu ích.

+0

Tôi sắp gặp điều này thông qua thử nghiệm, nhưng độ tin cậy ... rằng tôi không biết – frostymarvelous

+1

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/res/res/values/dimens .xml điều này có nghĩa là nó là một con số đáng tin cậy 48dp frostymarvelous

18

Kể từ api 21 có phương pháp chính thức để lấy insets cho thanh trạng thái và chuyển hướng chiều cao thanh khi là mờ

ViewCompat.setOnApplyWindowInsetsListener(view, new OnApplyWindowInsetsListener() { 
     @Override 
     public WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets) { 
      final int statusBar = insets.getSystemWindowInsetTop(); 
      final int navigationBar = insets.getSystemWindowInsetBottom(); 
      return insets; 
     } 
    }); 
+0

Siêu hữu ích! Điều duy nhất hoạt động như mong đợi ở chế độ nhiều cửa sổ với Android 7.0. – Petrus

+0

loại xem đó là "chế độ xem"? – urSus

2

Câu trả lời được chấp nhận luôn trả về chiều cao thanh trạng thái (và theo một cách hơi hacky). Nhưng một số hoạt động thực sự có thể là toàn màn hình và phương pháp này không phân biệt giữa chúng.

Phương pháp này hoạt động hoàn hảo cho tôi để tìm ra chiều cao thanh trạng thái liên quan đến các hoạt động hiện tại (đặt nó vào lớp Hoạt động của bạn, và sử dụng nó một lần bố trí đã hoàn tất):

public int getStatusBarHeight() { 
    Rect displayRect = new Rect(); 
    getWindow().getDecorView().getWindowVisibleDisplayFrame(displayRect); 
    return displayRect.top; 
} 

Lưu ý bạn cũng có thể chỉ sử dụng màn hình Đọc trực tiếp trong trường hợp bạn có "trang trí cửa sổ" khác ở dưới cùng hoặc thậm chí có thể là các cạnh của màn hình.

+0

Điều này làm việc cho bộ giả lập bảng WXGA 10.1 trong API 16 không hiển thị thanh trạng thái vì nó đặt thông tin trạng thái trong thanh điều hướng phía dưới. Vẫn đang tìm cách xác định chiều cao thanh trạng thái và/hoặc trạng thái hiển thị * trước * bố cục. – jk7

0

khuyên bạn nên sử dụng kịch bản này để có được chiều cao thanh trạng thái

Rect rectangle = new Rect(); 
Window window = getWindow(); 
window.getDecorView().getWindowVisibleDisplayFrame(rectangle); 
int statusBarHeight = rectangle.top; 
int contentViewTop = 
    window.findViewById(Window.ID_ANDROID_CONTENT).getTop(); 
int titleBarHeight= contentViewTop - statusBarHeight; 

    Log.i("*** Elenasys :: ", "StatusBar Height= " + statusBarHeight + " , TitleBar Height = " + titleBarHeight); 

(Phương pháp cũ) để có được chiều cao của thanh trạng thái trên phương pháp onCreate() của hoạt động của bạn, sử dụng phương pháp này:

public int getStatusBarHeight() { 
     int result = 0; 
     int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android"); 
     if (resourceId > 0) { 
      result = getResources().getDimensionPixelSize(resourceId); 
     } 
     return result; 
} 
Các vấn đề liên quan