2013-07-30 12 views
25

私の携帯電話をAndroid 4.3にアップグレードした後、私はアクションバーの下の影がもう見えないことに気付きました。私のアプリでは、私はwindowContentOverlayを使用してカスタム影を持っている:Android API 18のwindowContentOverlayはどうなりましたか?

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

それは常に表示されていますが、今、それは何も変更しないテーマからその行を削除するAPI 18 に行っています。他のAPIバージョンではデフォルトのわずかな影が表示されます。他

誰もがその問題に気づいたのか?

+0

私はちょうど今日我々のアプリで同じことに気づきました。簡単な解決策があると願っています。 – twaddington

+0

ActionBarSherlockを使用していますか? ActionBarSherlockの人たちから、この変更にいくつかの詳細がありますように – tad

+0

が見える:あなたは慎重に見るとhttps://github.com/JakeWharton/ActionBarSherlock/issues/1003 – twaddington

答えて

17

これは正式にバグで、次のプラットフォームのリリースで修正される予定です。 https://code.google.com/p/android/issues/detail?id=58280

UPDATE: これは私がすることで、このプラットフォームのバグを回避することができたAPIレベルで19

+0

を更新APIのように固定されているようです:/ –

+0

を、私は、デバイスは、API 19を有していなければならない(4.4)を考えます。この問題は4.3では発生しますが、4.2または4.1.2では発生しません! –

30

を固定しているようです私のベースFragmentActivityに次のメソッドを追加し、レイアウトが膨張された後onCreateでそれを呼び出す:

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

この作品は、あなたのテーマを変更したりレイアウトをレイアウトに動的に追加したりする必要がないのでうまくいきます。これは前方互換性があり、このバグが修正されると簡単に削除できます。

+0

Googleがバグを修正した場合、この修正プログラムを使用するアプリケーションは更新されるまで、double windowContentOverlaysで終了しますか? –

+0

@DaveFeldmanそれは依存します。 APIバージョンをインクリメントすると、アプリはダブルオーバーレイを持ちません。 SDKバージョンを変更しないインクリメンタルアップデートをリリースした場合、重複したオーバーレイを持つユーザーがいる可能性があります。 – twaddington

+0

@twaddingtonありがとう!これは完全に機能します。 – Tomasz