Android 无法在我的应用程序的代码中设置主题
我无法在我的Android应用程序中实现主题选择 这个问题以前被问过,但是解决方案——在setContentView之前调用application.setTheme(theme_id)——对我来说不起作用 styles.xml中定义了两个主题: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
<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)
}
}