2013-07-30 12 views
25

Po aktualizacji telefonu do systemu Android 4.3 zauważyłem, że cień pod paskiem akcji nie jest już wyświetlany. W moim app mam niestandardową cień korzystając windowContentOverlay:Co stało się z windowContentOverlay w Android API 18?

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

To zawsze było widać, ale teraz to już na API 18. usuwając tę ​​linię od tematu niczego nie zmienia. podczas gdy w innych wersjach API pokazuje domyślny cień.

Ktoś jeszcze zauważył ten problem?

+0

Właśnie zauważyłem to samo w naszej aplikacji dzisiaj. Mając nadzieję, że istnieje proste rozwiązanie. – twaddington

+0

Czy używasz ActionBarSherlock? – tad

+0

Wygląda na to, że jest więcej szczegółów na temat tej zmiany od facetów ActionBarSherlock: https://github.com/JakeWharton/ActionBarSherlock/issues/1003 – twaddington

Odpowiedz

17

To jest oficjalnie to błąd i zostanie ustalona dla następnej wersji platformy: https://code.google.com/p/android/issues/detail?id=58280

UPDATE: to wydaje się być ustalona na poziomie API 19

+0

Dostałem interfejs API budowania 19 i nadal nie otrzymałem zasobu:/ –

+0

Myślę, że urządzenie musi mieć API 19 (4.4) . Ten problem występuje w wersji 4.3, ale nie w wersji 4.2 ani 4.1.2! –

30

udało mi się obejść tej platformie błędu przez dodając następującą metodę do mojej bazy FragmentActivity i nazywając go onCreate po układ został nadmuchany:

/** 
* 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)); 
       } 
      } 
     } 
    } 
} 

to działa ładnie, ponieważ nie trzeba zmieniać motywów ani dynamicznie dodawać widoków do układów. Powinien być kompatybilny w przód i można go łatwo usunąć po naprawieniu tego błędu.

+0

Jeśli/kiedy Google naprawi błąd, czy aplikacje korzystające z tej poprawki zakończą się podwójnym oknemContentOverlays, dopóki nie zostaną zaktualizowane? –

+0

@DaveFeldman to zależy. Jeśli zwiększą wersję interfejsu API, a następnie nie, aplikacje nie będą miały podwójnej nakładki. Jeśli wydadzą przyrostową aktualizację, która nie zmieni wersji pakietu SDK niż tak, możesz mieć użytkowników z duplikatem nakładki. – twaddington

+0

@twaddington Dzięki! To działa idealnie. – Tomasz

Powiązane problemy