2012-07-19 77 views
65

在特殊情況下,我需要從我的活動中刪除對話框主題,但似乎沒有工作。這裏有一個例子以編程方式更改活動的主題

第一項活動:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    startActivity(new Intent(MainActivity.this, SecondActivity.class)); 
} 

次活動:

public void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setTheme(android.R.style.Theme); 
    setContentView(R.layout.activity_second); 
} 

清單摘錄:

<activity android:name="SecondActivity" android:theme="@android:style/Theme.Dialog"></activity> 

當我運行它仍然對話框主題。

API10

謝謝。

回答

108

由於docs說你必須在任何視圖輸出之前調用setTheme。看來super.onCreate()參加view處理。

所以,主題之間切換動態,你只需要super.onCreate之前調用setTheme這樣的:

public void onCreate(Bundle savedInstanceState) { 
    setTheme(android.R.style.Theme); 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_second); 
} 
+7

對我不起作用 – oscarthecat 2013-12-08 08:45:07

+0

@oscarthecat,你有工作嗎?如果是的話,你的解決方法是什麼? – nmxprime 2014-06-25 08:57:56

+0

適用於MotoG(v1)和Android 5.1系統。如果它不適合你,請分享設備+ Android版本。 – lenrok258 2016-06-17 10:14:13

8

我知道我遲到了,但我想在這裏發表一個解決方案:
檢查全源代碼here
這是我使用的偏好變化的主題時使用的代碼..

SharedPreferences pref = PreferenceManager 
     .getDefaultSharedPreferences(this); 
String themeName = pref.getString("prefSyncFrequency3", "Theme1"); 
if (themeName.equals("Africa")) { 
    setTheme(R.style.AppTheme); 



} else if (themeName.equals("Colorful Beach")) { 
    //Toast.makeText(this, "set theme", Toast.LENGTH_SHORT).show(); 
    setTheme(R.style.beach); 


} else if (themeName.equals("Abstract")) { 
    //Toast.makeText(this, "set theme", Toast.LENGTH_SHORT).show(); 

    setTheme(R.style.abstract2); 

} else if (themeName.equals("Default")) { 

    setTheme(R.style.defaulttheme); 

} 

請注意,您必須的setContentView之前把代碼..

編碼快樂!

+0

爲什麼?答案是正確的?! – dondondon 2015-10-25 06:14:06

9

user1462299的響應效果很好,但是如果包含片段,它們將使用原始活動主題。要應用主題的所有片段也可以覆蓋getTheme()方法的上下文,而不是:

@Override 
public Resources.Theme getTheme() { 
    Resources.Theme theme = super.getTheme(); 
    if(useAlternativeTheme){ 
     theme.applyStyle(R.style.AlternativeTheme, true); 
    } 
    // you could also use a switch if you have many themes that could apply 
    return theme; 
} 

你並不需要調用setTheme()在onCreate()方法了。您正在重寫每個請求,以此方式在此上下文中獲取當前主題。

+0

@誰低估:謹慎解釋你對我的反應不喜歡什麼? – 2016-11-29 10:16:58

+0

應該在Activity中或在相應的片段中覆蓋getTheme()?我在Activity中實現了這個功能,但Fragments仍然使用原來的Activity主題。 – saltandpepper 2018-03-07 18:57:05

+0

@saltandpepper在活動中覆蓋它就足夠了。確保你的分片代碼和佈局不要再改變它。 – 2018-03-08 12:17:31

相關問題