2011-01-11 31 views
36

Tôi đang cố gắng để có được một chủ đề do người dùng chọn và cảm thấy như tôi đang rất bực bội. Xác định chủ đề trong AndroidManifest.xml công trình như mong muốn, nhưng (như tốt nhất tôi có thể nói) không thể thay đổi dựa trên sở thích của ứng dụng:Chuyển đổi chủ đề ứng dụng rộng theo chương trình?

<application 
    android:theme="@style/theme_sunshine" 
    android:icon="@drawable/icon" 
    android:label="@string/app_name"> 

Ngoài ra, đặt nó tự động trong từng hoạt động cũng hoạt động:

someChosenTheme = PreferenceManager.getDefaultSharedPreferences(this).getString("themePreference", "theme_twilight"); 
setTheme(someOtherChosenTheme); 

Nhưng điều đó có vẻ lộn xộn và tôi muốn đặt chủ đề cho toàn bộ ứng dụng ở một nơi. Suy nghĩ đầu tiên của tôi là lấy bối cảnh ứng dụng càng sớm càng ra mắt hoạt động chính của tôi và làm điều đó có:

getApplicationContext().setTheme(R.style.theme_dummy); 

Như tốt nhất mà tôi có thể nói, this phải làm các trick, nhưng trên thực tế nó không phải làm bất cứ điều gì - các toàn bộ ứng dụng có kiểu Android mặc định. Là ở trên hợp lệ, và nếu như vậy, tôi có thể làm cái gì khác ngu ngốc?

Tôi đang làm việc ở cấp API 3 nếu vấn đề đó quan trọng. Prods đúng hướng rất nhiều đánh giá cao!

Related question.

Trả lời

30

Tạo hoạt động cơ sở cho ứng dụng của bạn và ghi đè lênTạo để đặt chủ đề. Nhận tất cả các hoạt động khác của bạn từ Hoạt động cơ sở này.

Ngoài ra kiểm tra hướng dẫn này: http://www.androidengineer.com/2010/06/using-themes-in-android-applications.html

+0

này về cơ bản những gì tôi đang làm. Nó vẫn không lý tưởng vì không có nhiều thừa kế, ví dụ: cho một ListActivity tùy chỉnh, nhưng sự bất tiện là nhỏ. Rất hữu ích hướng dẫn, mặc dù tôi đã đọc nó :) – Cheezmeister

+0

Tôi acutally có một BaseListActivity và một cơ sở (Generic) Hoạt động trong mọi ứng dụng tôi làm. Các BaseListActivity có xử lý chung của CRUD (đọc, thêm, chỉnh sửa, xóa) được xây dựng trong, vì vậy nó rất dễ dàng để tạo ra một hoạt động danh sách mới và chỉ ghi đè lên một vài phương pháp. Tất nhiên, nếu tôi thêm MapActivity hoặc TabActivity, tôi cũng phải tạo BaseXActivity cho chúng. Đôi khi đa kế thừa là tốt hơn :) – peter3

+5

Vì vậy, thêm setTheme cho mỗi hoạt động, trước khi "setContentView" được gọi là thực sự là giải pháp chính xác? không có một giải pháp toàn hệ thống nào? Ngoài ra, điều gì sẽ xảy ra với tất cả các hoạt động đã tồn tại? –

5

Có thể có một giải pháp tốt cho điều này, nhưng tôi không thể tìm thấy một, vì vậy tôi đã kết thúc thực hiện một ít phương pháp helper tĩnh trong một lớp helper mà phải mất một hoạt động và về cơ bản thực hiện những hai dòng bạn đã viết. Chắc chắn, nó không hoàn hảo, nhưng chỉ cần thêm một dòng mã ngắn cho mỗi phương pháp onCreate() trong ứng dụng của tôi là có thể chấp nhận được.

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