2016-12-21 56 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); 

不是指运行时值