【问题标题】:How to change default theme of application programatically?如何以编程方式更改应用程序的默认主题?
【发布时间】:2014-05-17 11:02:38
【问题描述】:

在我的 Android 应用程序中,我试图实现更改 Theme。我设法改变了我想要的所有东西的颜色,并且在运行时主题化效果很好(我使用SharedPreferences 来存储选择的颜色)。

但是,当我从头开始打开应用程序时,首先默认主题是可见的(准确地说是ActionBar 颜色),并且只有在一两秒钟后,当应用程序加载时,颜色才会更改为采用的颜色来自SharedPreferences

那么如何更改默认的Theme?或者有什么方法可以改变加载时可见的颜色?

更新:我在onCreate 中应用主题,但这还不够。

【问题讨论】:

标签: android android-layout themes android-theme


【解决方案1】:

对此我通常的建议是在清单中使用透明的全屏主题。

当您启动 Activity 时,切换到您的自定义主题。

结合这一点,我总是建议使用 alpha 动画从应用程序主题淡入淡出到活动主题。这可以防止在自定义主题出现时对用户造成震动。


清单主题定义为:

android:theme="@android:style/Theme.Translucent.NoTitleBar"

基础活动onCreate() 方法:

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

    // set your custom theme here before setting layout
    super.setTheme(android.R.style.Theme_Holo_Light_DarkActionBar);

    setContentView(R.layout.activity_main);

    overridePendingTransition(R.anim.fade_in, R.anim.fade_out);
}

基本淡入:

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromAlpha="0.0"
    android:toAlpha="1.0" />

基本淡出(不是真的需要,但为了完整性):

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="2000"
    android:fromAlpha="1.0"
    android:toAlpha="0.0" />

有关此问题的进一步相关讨论,请查看我对此相关问题的回答:

【讨论】:

    【解决方案2】:

    当应用第一次加载时,onCreate()...方法首先被执行。 所以检查这里的条件并应用主题。也做同样的 OnResume()..also.

        @Override
    protected void onCreate(Bundle savedInstanceState) {
    
        try {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);
        LinearLayout ml1 = (LinearLayout) findViewById(R.id.ml1);
    
        pref = new MySharedPreference();
        color = MySharedPreference.getColorCode(getApplicationContext());
        switch (color) {
        case 1:
            ml1.setBackgroundResource(R.drawable.woodenback1);
            break;
        case 2:
            ml1.setBackgroundResource(R.drawable.woodenback2);
            break;
        case 3:
            ml1.setBackgroundResource(R.drawable.woodenback3);
            break;
        case 4:
            ml1.setBackgroundResource(R.drawable.blueback);
            break;
        case 5:
            ml1.setBackgroundResource(R.drawable.leavesback);
            break;
        }
    
        } catch (Exception e) {
        }   
    

    【讨论】:

    • 我目前正在 onCreate 中应用主题,但它不起作用。我更新了问题。
    • 我不认为代码会有所帮助,但是:在 onCreate 中(只是在它的开头 - 我尝试了很多地方,但没有一个工作)我正在更改 ActionBar 的颜色,如下所示:@987654322 @ 'getCurrentTheme' 从 SharedPreferences 获取颜色
    【解决方案3】:

    实际上你应该在 res/values/styles.xml 中定义你的样式。我猜现在你已经有了以下配置:

    <style name="AppBaseTheme" parent="android:Theme.Holo.Light"/>
    <style name="AppTheme" parent="AppBaseTheme"/>
    

    因此,如果您想使用 Theme.Black,请将 AppBaseTheme 父级更改为 android:Theme.Black,或者您可以像这样在清单文件中直接更改应用程序样式 - android:theme="@android:style/Theme.Black"。您必须在样式标记之前缺少 android 命名空间

    How to change app default theme to a different app theme?

    【讨论】:

    • 我想在运行时更改默认主题,但无法在运行时编辑清单。我不是在寻找将主题更改为某些特定值的设置 - 它应该是灵活的。
    【解决方案4】:

    你可以这样做:

    String m_theme = "yourThemeName";
    final int themeID = activity.getResources().getIdentifier(m_theme,
                        "style", activity.getPackageName());
    activity.setTheme(themeID);
    

    【讨论】:

    • 它确实可以在运行时更改主题(确切地说是样式),但不会更改默认样式。所以,当应用程序运行时,我会看到默认颜色(来自清单中设置的主题),一秒钟后,会看到我在代码中设置的主题的颜色。
    猜你喜欢
    • 2023-03-28
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 2011-11-13
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    相关资源
    最近更新 更多