2012-03-12 49 views
4

所以,我有我的應用程序,當前標記爲更改singleTop活動的主題

android:launchMode="singleTop" 

的活動......我現在有兩個的onCreate onNewIntent邏輯確保屏幕始終顯示由啓動的最新Intent提供的數據。我希望能夠根據該Intent提供的數據在Holo.Light和Holo.Dark之間進行更改。

調用setTheme不工作(見這兩個環節):

這第二個鏈接都有涉及創建第二的AndroidManifest.xml一種解決方法具有其他主題並指向相關活動的空子類的條目。這是有效的,但它破壞了singleTop(因爲現在可以有兩個堆棧活動實例)。

我出來的想法。任何人都知道是否有任何方法可以執行此操作,而不必爲此活動滾動自己的自定義ActionBar視圖?

回答

1

您需要使用setTheme()方法設置主題,然後重新加載活動。

我有一個singleTask活動,以及上API < 11上運行的代碼,所以我有這樣的代碼重新加載活動:

public void reload() { 
    Intent intent = getIntent(); 
    overridePendingTransition(0, 0); 
    intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
    finish(); 

    overridePendingTransition(0, 0); 
    startActivity(intent); 
} 

我幾乎剛剛完成的活動,並再次調用它。我禁用任何過渡動畫以使重新加載看起來即時。

+0

這樣的聲音應該可以工作。謝謝! – Eric 2012-03-13 03:33:53

+1

對於其他任何正在嘗試此操作的人,我必須將方法的第3行更改爲intent.setFlags。有問題的意圖設置了Intent.FLAG_ACTIVITY_REORDER_TO_FRONT標誌,導致重啓失敗。 – Eric 2012-03-13 20:21:29

1

既然你指的是全息主題,我假設你正在使用API​​ 11+。

API 11添加了方法Activity#recreate(),該方法通過相同的拆卸/重新創建過程發送當前活動,該過程通常發生配置更改,例如在橫向和縱向之間旋轉屏幕。您的onCreate方法將在新的Activity實例上再次被調用,允許您在平常的窗口初始化之前在Activity上設置主題。

Google圖書應用使用此策略在「夜間模式」之間切換明/暗主題。

+0

對不起,actionbarsherlock標記應該表明我需要這個工作不僅僅是最新的和最好的。 – Eric 2012-03-13 03:33:23

+1

是的,但您仍然可以使用完成並啓動新活動的方法來支持較舊的操作系統版本,並在支持它的設備上使用這一項(假設更好的原因是API的一部分)。 – 2012-09-19 16:59:07

0

我會發布我的解決方案,並不真正添加新東西,但將各種提示合併在一起。

變更活動的主題和可選後(取決於你在找什麼)申請:

public void updateTheme(Activity a, int themeID) { 
    a.getApplication().setTheme(themeID); 
    a.setTheme(themeID); 
} 

然後,您必須重新創建活動(就如同配置更改後)。 對於操作系統11>有一個API,而不是以前的版本,您必須強制它完成並重新啓動活動,就像Udinic指出的一樣。

public boolean isBeforeHoneycomb() { 
    return Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB; 
} 

public void reload() { 
    if(isBeforeHoneycomb()) { 
     Intent intent = getIntent(); 
     overridePendingTransition(0, 0); 
     intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
     finish(); 

     overridePendingTransition(0, 0); 
     startActivity(intent); 
    }else{ 
     recreate(); 
    } 
}