2013-10-16 19 views
1

有人能告訴我如何在運行時將應用程序中的主題從全息切換到全息照明? 我想在設置中有兩個按鈕來選擇光線或黑色的主題。 如何在整個應用程序範圍內進行設置,而不僅僅是針對該活動?Android - 如何在運行時切換主題

我已經嘗試了一些setTheme()的東西,但我無法改變主題,當我點擊一個按鈕。

這是我設置的活動在這裏我想設置主題:

public class SettingsActivity extends Activity { 

@SuppressLint("NewApi") 
@Override 
protected void onCreate(Bundle savedInstanceState) { 


setTheme(android.R.style.Theme_Holo_Light); 

super.onCreate(savedInstanceState); 

setContentView(R.layout.settings); 

} 

好這個工作,我的主題設定,但是因爲我說我想通過按下一個按鈕來更改系統範圍。

謝謝!

+0

[開關應用範圍的主題編程?]的可能重複(http://stackoverflow.com/questions/4663752/switching-application-wide-theme - 程序化) –

+0

如果其中一個答案對您有幫助,您可以接受它。否則,你可以發佈一個答案與你所做的修復它。你不需要發表謝意作爲答案。 – dcaswell

回答

3

正如你所看到的主題設置在onCreate()setContentView()之前。所以當你想改變主題時,你應該再次調用oncreate()方法。但是在活動的生命週期中,onCreate()函數只會被調用一次。

有一個簡單的方法來做到這一點。我不確定這是最好的方法。

假設您想將新主題應用到活動1單擊按鈕。

onClick事件

  1. 保存主題內被應用,使得它甚至應該在應用程序重啓後予以保留(喜好或靜態volatile變量可以使用)。
  2. 完成當前活動(活動1)並調用一個新的活動(活動2)。

現在活動2

  1. 呼叫活動1和結束當前活動(活動2)。

活動1

  1. 應用保存的主題內onCreate

希望這不是混淆.. :)

+0

聽起來不錯,謝謝。我會今天嘗試:) – zFr3eak

+0

希望你會接受這個答案,如果它真的對你有幫助.. :) – Anu

+5

爲什麼不使用'recreate();'方法? – waqaslam

2

你不能改變其他應用程序的主題(謝天謝地)。

有點做到這一點的唯一方法是創建自己的操作系統版本,並將自己的主題作爲設備默認主題。但是,不使用設備默認主題的應用程序(即將主題明確設置爲Holo,Holo light等)將不會獲取設備默認主題。

編輯 - 爲了實現這個應用程序範圍內使用基本活動,創建一個看起來像這樣的活動:

public class BaseActivity extends Activity { 
    private static final int DEFAULT_THEME_ID = R.id.my_default_theme; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     int themeId = PreferenceManager.getDefaultSharedPreferences(context) 
       .getInt("themeId", DEFAULT_THEME_ID); 
     setTheme(themeId); 

     super.onCreate(savedInstanceState); 
    } 
} 

然後所有的活動都應該擴展該BaseActivity。如果要更改主題,請務必將其保存到SharedPreferences中。

+0

我想你錯過了我。我不想改變所有應用程序的主題,我的意思是我有我的應用程序(計算器)與默認主題(Holo.light),我想從主題holo.light更改爲全息開/關只能在我的計算器應用中進行查詢。 – zFr3eak

+0

啊,在這種情況下請參閱[以編程方式切換應用程序範圍的主題?](http://stackoverflow.com/q/4663752/1253844)。 –

+0

我已經看到了,但我無法重現它。任何一個簡短的例子的機會? – zFr3eak