以编程方式更改活动主题不起作用[重复]

Posted

技术标签:

【中文标题】以编程方式更改活动主题不起作用[重复]【英文标题】:Change Activity theme programmatically dosen't work [duplicate] 【发布时间】:2019-08-17 08:46:45 【问题描述】:

我想从代码中更改应用主题,但它不起作用。

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

    setTheme(R.style.NightMode);

    setContentView(R.layout.activity_main);

    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar)

错误

E/androidRuntime: 致命异常: main 进程:com.w7orld.animex,PID:23421 java.lang.RuntimeException:无法启动活动 ComponentInfocom.w7orld.animex/com.w7orld.animex.MainActivity:java.lang.IllegalStateException:此活动已经有一个由窗口装饰提供的操作栏。不要在主题中请求 Window.FEATURE_SUPPORT_ACTION_BAR 并将 windowActionBar 设置为 false 以使用工具栏。 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 在 android.app.ActivityThread.-wrap11(未知来源:0) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) 在 android.os.Handler.dispatchMessage(Handler.java:106) 在 android.os.Looper.loop(Looper.java:164) 在 android.app.ActivityThread.main(ActivityThread.java:6494) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 原因:java.lang.IllegalStateException:此活动已经有一个由窗口装饰提供的操作栏。不要在主题中请求 Window.FEATURE_SUPPORT_ACTION_BAR 并将 windowActionBar 设置为 false 以使用工具栏。 在 android.support.v7.app.AppCompatDelegateImpl.setSupportActionBar(AppCompatDelegateImpl.java:345) 在 android.support.v7.app.AppCompatActivity.setSupportActionBar(AppCompatActivity.java:130) 在 com.w7orld.animex.MainActivity.onCreate(MainActivity.java:70) 在 android.app.Activity.performCreate(Activity.java:7009) 在 android.app.Activity.performCreate(Activity.java:7000) 在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 在 android.app.ActivityThread.-wrap11(未知来源:0) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) 在 android.os.Handler.dispatchMessage(Handler.java:106) 在 android.os.Looper.loop(Looper.java:164) 在 android.app.ActivityThread.main(ActivityThread.java:6494) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

【问题讨论】:

为什么要在 onCreate 中以编程方式更改主题?你应该在活动声明中设置它。 我想要支持夜间模式,所以我应该在 onCreate 中更改它。 我该怎么做??必须是没有操作栏的主要活动,因为有自定义工具栏。 【参考方案1】:

我找到了这样做的方法。在 onCreate 我把这个

setTheme(Designs.getThemeNoActionBar(this));
    setContentView(R.layout.activity_main);

从共享首选项中获取主题并返回没有操作栏的主题。

  public static int getThemeNoActionBar(Context context) 
        SharedPreferences sharedPreferences = context.getSharedPreferences("Designs", Context.MODE_PRIVATE);
        int theme = sharedPreferences.getInt("theme", R.style.AppTheme);
        if (theme == nightModeTheme)
            return R.style.NightMode_NoActionBar;
        else if (theme == theme1)
            return R.style.Theme1_NoActionBar;
        else 
             return R.style.AppTheme_NoActionBar;
    

在样式资源中

<style name="AppTheme.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

<style name="NightMode.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

<style name="Theme1.NoActionBar">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

【讨论】:

这基本上就是我发布的教程显示的内容。干得好!【参考方案2】:

我们这样设置夜间模式:

public class App extends Application 
 public static final String TAG = "App";

private boolean isNightModeEnabled = false;

 @Override
   public void onCreate() 
   super.onCreate();

  // We load the Night Mode state here
   SharedPreferences mPrefs =  PreferenceManager.getDefaultSharedPreferences(this);
   this.isNightModeEnabled = mPrefs.getBoolean(“NIGHT_MODE”, false);
 

public boolean isNightModeEnabled() 
   return isNightModeEnabled;
 

public void setIsNightModeEnabled(boolean isNightModeEnabled) 
   this.isNightModeEnabled = isNightModeEnabled;
  

由于此实例将在其他所有操作之前启动,因此您可以随时调用 isNightModeEnabled(),因此,一旦您的应用打开,就可以在任何 Activity 中调用。

public final class FeedActivity extends AppCompatActivity 
 private final static String TAG = “FeedActivity”;

@Override
 protected void onCreate(Bundle savedInstanceState) 
    if (MyApplication.getInstance().isNightModeEnabled()) 
       setTheme(R.style.FeedActivityThemeDark);
    
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_feed);
 

如何在 Android 中使用夜间模式是 posted here

以下是一些示例图片,显示了夜间骑行和夜间骑行的区别:

【讨论】:

【参考方案3】:

可见的第一个问题是这些行的位置:

setTheme(R.style.NightMode);

setContentView(R.layout.activity_main);

您必须始终将setContentView(layout) 调用紧跟在super.onCreate(savedInstanceState); 之后。因为这是生成布局及其视图的代码。

【讨论】:

"您必须始终将 setContentView(layout) 调用放在 super.onCreate(savedInstanceState); 之后立即调用- 不,你没有。如果我想在 onCreate 和 setContentView 之间添加几个与布局无关的字段,那不会神奇地使应用崩溃。 严格来说,您可以毫无问题地进行setContentViewless 活动。毫无意义,是的,但仍然允许和可能

以上是关于以编程方式更改活动主题不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式更改视图尺寸时,自动布局似乎不起作用

UIPageViewController - 以编程方式更改页面在 iPhone 4s/5/5s 上不起作用

以编程方式制作的约束不起作用

以编程方式更改Chip Widget样式不起作用 - Android

iPad方向以编程方式不起作用

iOS 13:调整 UITabBar 高度不起作用 [重复]