Android 无法在我的应用程序的代码中设置主题

Android 无法在我的应用程序的代码中设置主题,android,android-theme,Android,Android Theme,我无法在我的Android应用程序中实现主题选择 这个问题以前被问过,但是解决方案——在setContentView之前调用application.setTheme(theme_id)——对我来说不起作用 styles.xml中定义了两个主题: <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> <item name="colorPrimary">@color/colorPrim

我无法在我的Android应用程序中实现主题选择

这个问题以前被问过,但是解决方案——在setContentView之前调用application.setTheme(theme_id)——对我来说不起作用

styles.xml中定义了两个主题:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

<!-- second theme, hard coded colors for testing -->
<style name="DarkTheme" parent="Theme.AppCompat.DayNight">
    <item name="colorPrimary">#ff0000</item>
    <item name="colorPrimaryDark">#00ff00</item>
    <item name="colorAccent">#0000ff</item>
</style>
结果:AndroidManifest.xml中定义的主题仍然被使用,setTheme调用没有任何效果

没有编译警告,没有运行时消息,没有可疑的日志条目


使用了Kotlin,但这不应该是问题的原因。

最后我设法让它工作起来

需要说明的是:我首先发布的代码:

class MainActivity : AppCompatActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    application.setTheme(R.style.DarkTheme)
    setContentView(R.layout.activity_main)
  }
}
根据对类似问题的许多回答,应该起作用

但事实并非如此

还包括:

class MainActivity : AppCompatActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    application.setTheme(R.style.DarkTheme)
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
  }
}
或者函数调用序列中的其他排列不能解决问题

Björn Kechel的答案是,这不是一个真正的解决方案,而是一个解决问题的方法

覆盖Activity中的getTheme方法,而不是调用none functional setTheme方法:

class MainActivity : AppCompatActivity() {

  protected var selectedTheme : String = ""
  lateinit protected var sharedPreferences : SharedPreferences
  var initialized = false

  fun init() {
    if (!initialized) {
      initialized = true
      sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
    }
    if ("" == selectedTheme) {
      selectedTheme = sharedPreferences.getString("selected_theme", "AppTheme")
    }
  }

  override fun getTheme(): Resources.Theme {
    init()
    val theme = super.getTheme()
    when(selectedTheme) {
      "DarkTheme" -> {
        theme.applyStyle(R.style.DarkTheme, true)
      }
      "AppTheme" -> {
        theme.applyStyle(R.style.AppTheme, true)
      }
    }
    return theme
  }

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    setContentView(R.layout.activity_main)

    settings.setOnClickListener {
      openSettings()
    }
  }

  fun openSettings() {
    val intent = Intent(baseContext, SettingsActivity::class.java)
    startActivity(intent)
  }
}

不,这不是复制品。正如我在问题中详细描述的,主题没有问题。两者都从AppCompat继承,都经过测试,在清单中使用时都能正常工作。但是onCreate中对application.setTheme(R.style.DarkTheme)的调用不起作用。这就是问题所在。很抱歉,这不够清楚。活动中在哪里定义了应用程序?为什么不使用应用程序类来设置应用程序主题?此外,您需要重新启动活动,以便注意到任何主题更改,如链接问题中所述,可能重复“在super.onCreate之前调用setTheme”
class MainActivity : AppCompatActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    application.setTheme(R.style.DarkTheme)
    setContentView(R.layout.activity_main)
  }
}
class MainActivity : AppCompatActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    application.setTheme(R.style.DarkTheme)
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
  }
}
class MainActivity : AppCompatActivity() {

  protected var selectedTheme : String = ""
  lateinit protected var sharedPreferences : SharedPreferences
  var initialized = false

  fun init() {
    if (!initialized) {
      initialized = true
      sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
    }
    if ("" == selectedTheme) {
      selectedTheme = sharedPreferences.getString("selected_theme", "AppTheme")
    }
  }

  override fun getTheme(): Resources.Theme {
    init()
    val theme = super.getTheme()
    when(selectedTheme) {
      "DarkTheme" -> {
        theme.applyStyle(R.style.DarkTheme, true)
      }
      "AppTheme" -> {
        theme.applyStyle(R.style.AppTheme, true)
      }
    }
    return theme
  }

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    setContentView(R.layout.activity_main)

    settings.setOnClickListener {
      openSettings()
    }
  }

  fun openSettings() {
    val intent = Intent(baseContext, SettingsActivity::class.java)
    startActivity(intent)
  }
}