2013-07-30 31 views
25

Sau khi nâng cấp điện thoại lên Android 4.3, tôi nhận thấy bóng bên dưới thanh tác vụ không hiển thị nữa. Trong ứng dụng của tôi, tôi đã có một cái bóng tùy chỉnh sử dụng windowContentOverlay:Điều gì đã xảy ra với windowContentOverlay trong Android API 18?

<item name="android:windowContentOverlay">@drawable/shadows_bottom</item> 

Nó luôn luôn được thể hiện nhưng bây giờ nó đã biến mất trên API 18. Loại bỏ dòng từ chủ đề không thay đổi bất cứ điều gì. trong khi trên các phiên bản API khác, nó cho thấy một bóng tối mặc định.

Bất kỳ ai khác đã nhận thấy sự cố đó?

+0

Tôi vừa nhận thấy điều tương tự trong ứng dụng của chúng tôi hôm nay. Hy vọng có một giải pháp đơn giản. – twaddington

+0

Bạn đang sử dụng ActionBarSherlock? – tad

+0

Có vẻ như có thêm một số chi tiết về sự thay đổi này từ các nhân viên ActionBarSherlock: https://github.com/JakeWharton/ActionBarSherlock/issues/1003 – twaddington

Trả lời

17

Đây là chính thức một lỗi và sẽ được cố định cho nền tảng phiên bản tiếp theo: https://code.google.com/p/android/issues/detail?id=58280

UPDATE: Điều này dường như được thay đổi theo level API 19

+0

Tôi đã nhận được mục tiêu xây dựng API 19 và vẫn không tìm thấy tài nguyên:/ –

+0

Tôi nghĩ rằng thiết bị phải có API 19 (4.4) . Vấn đề này xảy ra trên 4.3, nhưng không xảy ra trên 4.2 hoặc 4.1.2! –

30

tôi đã có thể làm việc xung quanh lỗi nền tảng này bằng cách thêm các phương pháp sau để cơ sở của tôi FragmentActivity và gọi đó là trong onCreate sau khi bố trí đã được thổi phồng:

/** 
* Set the window content overlay on device's that don't respect the theme 
* attribute. 
*/ 
private void setWindowContentOverlayCompat() { 
    if (Build.VERSION.SDK_INT == Build.VERSION_CODES.JELLY_BEAN_MR2) { 
     // Get the content view 
     View contentView = findViewById(android.R.id.content); 

     // Make sure it's a valid instance of a FrameLayout 
     if (contentView instanceof FrameLayout) { 
      TypedValue tv = new TypedValue(); 

      // Get the windowContentOverlay value of the current theme 
      if (getTheme().resolveAttribute(
        android.R.attr.windowContentOverlay, tv, true)) { 

       // If it's a valid resource, set it as the foreground drawable 
       // for the content view 
       if (tv.resourceId != 0) { 
        ((FrameLayout) contentView).setForeground(
          getResources().getDrawable(tv.resourceId)); 
       } 
      } 
     } 
    } 
} 

tác phẩm này độc đáo vì bạn không phải thay đổi chủ đề của mình hoặc tự động thêm chế độ xem vào bố cục của mình. Nó sẽ được chuyển tiếp tương thích và có thể dễ dàng loại bỏ khi lỗi này đã được sửa.

+0

Nếu/khi Google sửa lỗi, các ứng dụng có sử dụng bản sửa lỗi này sẽ kết thúc với cửa sổ đôiContentOverlays cho đến khi chúng được cập nhật không? –

+0

@DaveFeldman nó phụ thuộc. Nếu họ tăng phiên bản API thì không, ứng dụng sẽ không có lớp phủ kép. Nếu họ phát hành bản cập nhật gia tăng không thay đổi phiên bản SDK, bạn có thể có người dùng có lớp phủ trùng lặp. – twaddington

+0

@twaddington Cảm ơn người đàn ông! Điều này hoạt động hoàn hảo. – Tomasz

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