2011-09-19 130 views
4

我試圖用java代碼更改運行時的主題,因爲我想讓用戶能夠通過首選項菜單更改應用程序主題。 所以,我讓用戶的主題,然後讀取結果是這樣的:在java中更改主題不會改變背景顏色

if (...) { 
    getApplication().setTheme(R.style.BlackTheme); 
} else { 
    getApplication().setTheme(R.style.LightTheme); 
} 

不幸的是,由於某種原因,這並不工作.... 的字體顏色稍微暗灰色(光主題)轉移到一個更明亮的灰色(黑色主題) ,但背景始終保持白色/黑色(取決於最初在清單文件中選擇哪個主題)

如果我完全刪除清單文件中的主題條目,彷彿我會選擇黑色主題....

....我有忽略的東西嗎?

+0

這應該在setContentView之前調用,所以你可能需要重新「創建」你的活動 –

+0

不,這是行不通的。我只是調用setContentView(R.layout.blabla);然後它應該被「重新創建」,對吧? 好吧,它不工作: -/ – RazorHail

回答

0

您不能在運行時設置應用程序主題。如果你想改變無處不在的主題,在您的應用程序,你必須調用

setTheme(渣油)

在活動的onCreate第一件事()。

如:

@覆蓋公共無效的onCreate(捆綁savedInstanceState){ setTheme(渣油)}

如果你想改變已經開始活動的主題,那麼你必須重新創建它們。

+1

我該如何讓用戶更改設置中的主題,然後將其切換到該主題? 我必須先摧毀應用程序嗎?這不會與在Manifest中設置的主題相沖突嗎? – RazorHail

1

我有同樣的問題,我用這種方式解決了..

@Override 
public void onCreate(Bundle savedInstanceState) { 

    if (getIntent().hasExtra("bundle") && savedInstanceState==null){ 
     savedInstanceState = getIntent().getExtras().getBundle("bundle"); 
    } 

    //add code for theme 

    switch(theme) 
    { 
    case LIGHT: 
     setTheme(R.style.LightTheme); 
     break; 
    case BLACK: 
     setTheme(R.style.BlackTheme); 
     break; 

    default: 
    } 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    //code 

} 

這個代碼是重新創建活動節省捆綁和更改主題。 你必須自己編寫onSaveInstanceState(Bundle outState); 從API-11,您可以使用該方法重新創建(),而不是

Bundle temp_bundle = new Bundle(); 
onSaveInstanceState(temp_bundle); 
Intent intent = new Intent(this, MainActivity.class); 
intent.putExtra("bundle", temp_bundle); 
startActivity(intent); 
finish();