2012-07-12 27 views
14

tôi bao gồm bố trí theo kiểu xml của tôi:Làm cách nào để có một bóng đổ trên ActionBar (ActionBarSherlock)?

<resources xmlns:android="http://schemas.android.com/apk/res/android"> 
    <style name="Theme.Styled" parent="Theme.Sherlock"> 
     <item name="actionBarStyle">@style/Widget.MyApp.ActionBar</item> 
     <item name="android:actionBarStyle">@style/Widget.MyApp.ActionBar</item> 

    </style> 

    <style name="Widget.MyApp.ActionBar" parent="Widget.Sherlock.Light.ActionBar"> 
     <item name="titleTextStyle">@style/Widget.MyApp.TitleTextStyle</item> 
     <item name="background">@color/red</item> 
     <item name="android:background">@color/red</item> 
     <item name="windowContentOverlay">@null</item> 
     <item name="android:windowContentOverlay">@null</item> 
    </style> 

    <style name="Widget.MyApp.TitleTextStyle" parent="TextAppearance.Sherlock.Widget.ActionBar.Title"> 
     <item name="android:textColor">@color/white</item> 
     <item name="android:textSize">21sp</item> 
    </style> 

</resources> 

Một số tìm kiếm trên internet cho thấy rằng việc sử dụng windowContentOverlay thiết lập để @null. Nhưng khi tôi sử dụng nó trong phong cách xml nó không thay đổi bất cứ điều gì. Bất kỳ ai có thể giúp đỡ phải làm gì không?

Trả lời

30

Nếu bạn muốn tạo bóng bên dưới ActionBar, bạn phải đặt tham số android:windowContentOverlay về chủ đề ứng dụng (trong mã của bạn, bạn đang đặt không chính xác theo kiểu ActionBar).

Trong ví dụ của bạn nó sẽ là:

<style name="Theme.Styled" parent="Theme.Sherlock"> 
     ... 
     <item name="android:windowContentOverlay">@drawable/my_actionbar_shadow</item> 
</style> 

Sử dụng @null giá trị loại bỏ các bóng.

Dòng này đặt bóng trên ActionBar trên Android 3.0 trở lên. Tuy nhiên nếu bạn đang sử dụng ActionBarSherlock, nó sẽ không hoạt động như bạn mong đợi. Nó sẽ tạo bóng trên đầu cửa sổ trên ActionBarSherlock trên thiết bị Android chạy hệ điều hành cũ hơn Android 4.0 (mặc dù ActionBar có mặt trong api kể từ Android 3.0, ActionBarSherlock sử dụng triển khai tùy chỉnh cho tất cả các phiên bản Android cũ hơn Android 4.0).

Để tạo bóng bên dưới ActionBarSherlock, bạn phải đặt tham số windowContentOverlay về chủ đề ứng dụng (chú ý số thiếu android:).

<style name="Theme.Styled" parent="Theme.Sherlock"> 
     ... 
     <item name="windowContentOverlay">@drawable/my_actionbar_shadow</item> 
</style> 

Một lần nữa, sử dụng @null xóa bóng.

Mặc dù dòng này hoạt động cho ActionBarSherlock, nhưng nó không hoạt động trên các thiết bị Android chạy Android 4.0 trở lên, không có bóng được tạo dưới ActionBar trên các thiết bị như vậy. Vậy làm thế nào để kết hợp hai tham số này để có được bóng mong muốn trong cả ActionBar và ActionBarSherlock?

Sử dụng resource configuration qualifiers, trong trường hợp sử dụng phiên bản nền tảng của bạn. Trong res/values/styles.xml hãy sử dụng mã xml thứ hai. Và trong res/values-v14/styles.xml, hãy sử dụng mã xml đầu tiên. Do đó phiên bản ActionBarSherlock được sử dụng theo mặc định (cho các phiên bản trước Android 4.0) và phiên bản ActionBar được sử dụng cho Android 4.0 trở lên.

Edit: Có một bug trong Android 4.3 (API cấp 18), android:windowContentOverlay không hoạt động. Nó sẽ được cố định trong bản phát hành trong tương lai. Trong trường hợp bạn cần nó cố định trong Android 4.3, bạn có thể tìm thấy cách giải quyết được liên kết trong báo cáo lỗi.

5

Như câu trả lời trước đã nói sử dụng "windowContentOverlay" trong chủ đề ứng dụng và KHÔNG phải là kiểu thanh hành động.

<style name="Theme.Styled" parent="Theme.Sherlock"> 
     ... 
     <item name="windowContentOverlay">@drawable/my_actionbar_shadow</item> 
</style> 

Nếu bạn muốn có một bóng thực tế, bạn có thể tìm thấy một trong "Android thư mục của bạn"/nền tảng/android-16/data/res/drawable-hdpi/

ab_solid_shadow_holo.9.png và sao chép nó vào thư mục drawable-hdpi của bạn sau đó kết quả cuối cùng là

<style name="Theme.Styled" parent="Theme.Sherlock"> 
     ... 
     <item name="windowContentOverlay">@drawable/ab_solid_shadow_holo</item> 
</style> 
+1

Hình ảnh vá Android 9 không quá thẩm mỹ, tôi đã sử dụng xong. Cảm ơn :) – Mehdiway

3

Bên cạnh đó, trên API21 (Lollipop), bạn sẽ cần điều này trong mã, quá.

getSupportActionBar().setElevation(0); 
Các vấn đề liên quan