2011-01-28 29 views
8

Tôi đã có thể ghi đè bất kỳ chủ đề nào có tên "android:" được thêm vào chúng, nhưng tệp themes.xml của Android cũng xác định các thuộc tính dường như không thể ghi đè. Ví dụ:Ghi đè các chủ đề Android mặc định

<!-- Variation on the Light theme that turns off the title --> 
<style name="Theme.Codebase" parent="android:style/Theme.Light"> 
    <item name="android:windowNoTitle">true</item> 
    <item name="android:windowContentOverlay">@null</item> 
    <item name="colorBackground">@color/off_white</item> 
</style> 

colorBackground được định nghĩa trong xml Theme.Light, nhưng thêm ở đây mang lại cho tôi một lỗi

/res/values/styles.xml:10: error: Error: No resource found that matches the given name: attr 'colorBackground'. 

. Làm cách nào để ghi đè kiểu đó cho toàn bộ Ứng dụng?

+0

Những thẻ không có android: dường như được xác định bên trong tệp xml attr trong cùng một thư mục res/values ​​trong nguồn Android. http://android.git.kernel.org/?p=platform/frameworks/base.git;a=tree;f=core/res/res/values;hb=HEAD Xem attrs.xml và attrs_manifest.xml I nghĩ rằng bạn cần phải nhập những thứ này bằng cách sử dụng xmlns hoặc thêm các tệp tương tự vào thư mục giá trị của bạn, nhưng tôi không biết đủ về xml để chắc chắn. – Jems

Trả lời

8

Bạn có thể ghi đè lên các thuộc tính chuẩn giống như cách bạn sửa đổi các thuộc tính như windowNoTitle, chỉ cần đừng quên để thêm android: tiền tố như thế này:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <style name="SEclubTheme" parent="@android:style/Theme"> 
     <item name="android:colorForeground">@color/bright_foreground_dark</item> 
     <item name="android:colorBackground">@color/background_dark</item> 
    </style> 
</resources> 
+0

Vâng, tôi đã hiểu điều đó. Tôi vẫn còn bối rối như thế nào "colorBackground" hoạt động theo cách riêng của mình trong các chủ đề của họ. Bất kỳ ý tưởng? Câu trả lời hay nhất hiện nay! – typeoneerror

+0

Điều đó tôi có thể nói. Nó định nghĩa tham số 'colorBackgroundCacheHint', được sử dụng trong các kiểu' ListView' để thực hiện một số tối ưu hóa dựa trên giả định rằng các khung nhìn luôn luôn được vẽ trên nền màu đồng nhất. Bên cạnh đó dường như không có sử dụng cho thuộc tính này. Điều quan trọng hơn là thuộc tính 'windowBackground', như tên cho thấy, xác định nền cửa sổ. – Malcolm

3

Nếu không có tiền tố attr, colorBackground của bạn sẽ trở thành một thuộc tính mà bạn cần phải xác định. Xem xét ví dụ sau đây theme_dependent_icon được định nghĩa trong một styles.xml:

<resources xmlns:android="http://schemas.android.com/apk/res/android"> 
    <declare-styleable name="custom_menu"> 
      <attr name="theme_dependent_icon" format="reference"/> 
    </declare-styleable> 
    <style name="MyDarkTheme" parent="android:Theme" > 
     <item name="theme_dependent_icon">@drawable/ic_search_dark</item> 
    </style> 
    <style name="MyLightTheme" parent="android:Theme.Light" > 
     <item name="theme_dependent_icon">@drawable/ic_search_light</item> 
    </style> 
</resources> 

Sau đó, bạn có thể sử dụng thuộc tính qua ?attr/theme_dependent_icon trong main_activity.xml của bạn:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 
    <ImageView 
     android:id="@+id/imageView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="?attr/theme_dependent_icon" /> 
</LinearLayout> 

Trong ví dụ này, bởi vì tôi đã sử dụng tên chủ đề tùy chỉnh MyDarkThemeMyLightTheme, họ cần phải được chọn trong thời gian onCreate hoạt động chính của bạn trước setContentView, tức là

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setTheme(R.style.MyDarkTheme); // causes ic_search_dark.png to be shown 
    // setTheme(R.style.MyLightTheme); // causes ic_search_light.png to be shown 
    setContentView(R.layout.main_activity); 
} 

Bộ gọi điệnTheme() là một cách để chọn chủ đề trong khi chạy. Một cách khác là xác định nhiều phiên bản của styles.xml trong tài nguyên của bạn theo values, values-11, values-14 tương ứng với chủ đề mặc định, chủ đề cho Android 3.0 (API-11) và chủ đề cho Android 4.0 (API-14).

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