2016-12-21 58 views
7

我知道這個問題被問了幾次。但我不能在我的情況下找到問題。 我想改變應用程序的主題,但我的colorPrimary,colorAccent等不會改變。setTheme不改變主題顏色

我的MainActivity擴展了BasicActivity。它看起來像這樣:

public class MainActivity extends BasicActivity { 
    public static String MY_PREFS = "MY_PREFS"; 
    private SharedPreferences mySharedPreferences; 
    int prefMode = Activity.MODE_PRIVATE; 

    private Toolbar toolbar; 
    private TabLayout tabLayout; 
    private ViewPager viewPager; 
    private ViewPagerAdapter adapter; 
    private TextView tabOne, tabTwo, tabThree; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

} 
} 

這是我BasicActivity(在這種情況下,我把它更簡單,以表明該主題是從R.style取):

public class BasicActivity extends AppCompatActivity { 

    public static String MY_PREFS = "MY_PREFS"; 
    int prefMode = Activity.MODE_PRIVATE; 



    protected void onCreate(Bundle savedInstanceState) { 


     JsonParser parser = new JsonParser(getApplicationContext()); 

     int resourceId = this.getResources().getIdentifier(parser.getThemeID(), "style", this.getPackageName()); 
     setTheme(R.style.c_2ecc71_BC6C2B); 


     if (android.os.Build.VERSION.SDK_INT >= 19) { 
      getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 

     } 

     super.onCreate(savedInstanceState); 

    } 

} 

和我的XML:

<style name="c_2ecc71_BC6C2B" parent="@style/Theme.AppCompat.Light.NoActionBar"> 
    <!-- Customize your theme here. --> 
    <item name="colorPrimary">#2ecc71</item> 
    <item name="colorPrimaryDark">#1ebc61</item> 
    <item name="colorAccent">#BC6C2B</item> 
</style> 

根據前面的問題,此代碼應工作,但在我的情況有colorPrimary在其XML的觀點仍在加載老主題的顏色insted的,即使我設置了主題befo新一重新打電話setContentView(R.layout.activity_main);

謝謝!

+1

你硬編碼的主題BaseActivity值,比獲取引用資源ID。你需要把setTheme(value_from_resourceId); BaseActivity總是調用setTheme(R.style.c_2ecc71_BC6C2B); 比運行時間值 – Stallion

回答

1

不知道如果你真的想以編程方式設置它,但你可以試試這個:如果你正在尋找將其設置爲整個應用程序How to setTheme to an activity at runtime? It doesn't work call setTheme before onCreate and setContentView

,可能更容易/清潔劑將其設置在改爲使用AndroidManifest.xml文件。

<application android:theme="@style/CustomTheme"> 

此外,我會盡量避免使用具有值的樣式名稱。使用樣式的目的是爲了避免對值進行硬編碼並允許它們可配置和可重用。如果你想改變colorPrimary,你還會改變你的風格名稱嗎?

+0

我希望能夠在運行時在媒體上進行更改 – Max

+0

是的,這就是答案中第一個鏈接所解釋的內容。你應該能夠像這樣的代碼: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setTheme(android.R.style.Theme_Translucent_NoTitleBar); //設置爲 setContentView(...) } –

0

要在運行時設置主題,你可以使用下面的代碼行:

setTheme(android.R.style.Theme_Name);

並在onCreate()方法內調用setContentView()和super.onCreate()方法之前寫入它。

+0

已經嘗試過.. – Max

1

在manifest文件中確保正確的主題活動....

1

如果你想改變那種東西在運行時,您必須將所有這些「setTheme(android.R.style.Theme_Name);」 runonUiThread中的方法如下:

public class BasicActivity extends AppCompatActivity { 

public static String MY_PREFS = "MY_PREFS"; 
int prefMode = Activity.MODE_PRIVATE; 



protected void onCreate(Bundle savedInstanceState) { 


    JsonParser parser = new JsonParser(getApplicationContext()); 

    int resourceId = this.getResources().getIdentifier(parser.getThemeID(), "style", this.getPackageName()); 

    runOnUiThread(new Runnable() { 

        @Override 
        public void run() { 

        setTheme(R.style.c_2ecc71_BC6C2B); 
        } 
       }); 

    recreate(); 
    if (android.os.Build.VERSION.SDK_INT >= 19) { 
     getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 

    } 

    super.onCreate(savedInstanceState); 

} 

} 

and call recreate()after!

根據Android的 -

無效重新創建() 導致此活動與一個新的實例來重建。由於配置更改,這會導致與創建Activity時基本相同的流程 - 當前實例將經歷其生命週期到onDestroy(),然後創建一個新實例。

+0

不工作..... – Max

3

如果使用的片段,它們將忽略已在OnCreate()中設置的值,如果重寫getTheme()方法,這將片段內使用,以及:

回答上不同問題:Change Activity's theme programmatically

​​

用它在你的MainActivity或您的BasicActivity根據您希望它適用。你不需要在onCreate中改變它。

+0

這正是我所需要的 –

1

只需修改您的BasicActivity和MainActivity,如下所示並創建適當的主題。您可以使用共享首選項在應用程序啓動時檢查主題狀態。

BasicActivity的.java

public abstract class BasicActivity extends AppCompatActivity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    try { 
     if (getLayoutID() != 0) { 
      setContentView(getLayoutID()); 
     } 
    } catch (Exception ex) { /* ... */ } 

    final boolean THEME_DARK = true;// read appropriate value from SP or any other storage 

    Toolbar toolbar; 
    if ((toolbar = getToolbar()) != null) { 
     if (THEME_DARK/* check theme type here*/) { 
      toolbar.setPopupTheme(R.style.c_2ecc71_BC6C2B); 
     } 
     try { 
      setSupportActionBar(toolbar); 
     } catch (NoClassDefFoundError e) { 
      // Toast 
      finish(); 
     } 
    } 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     Window window = getWindow(); 
     window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 
     window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 
     window.setStatusBarColor(getResources().getColor(R.color.colorPrimary)); 
    } 
} 

public abstract Toolbar getToolbar(); 

public abstract int getLayoutID(); 

}  

MainActivity.java

public class MainActivity extends BasicActivity { 

    private Toolbar toolbar; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public Toolbar getToolbar() { 
     return toolbar == null ? toolbar = (Toolbar) findViewById(R.id.toolbar) : toolbar; 
    } 

    @Override 
    public int getLayoutID() { 
     return R.layout.activity_main; 
    } 
    } 
1

你有硬編碼的主題BaseActivity,而不是越來越針對性的資源ID。

你需要把setTheme(value_from_resourceId);

目前BaseActivity總是調用,不論你解析

setTheme(R.style.c_2ecc71_BC6C2B); 

不是指運行時值