我有一个通过setTheme()设置主题的简单活动,主题ID存储在SharedPreferences中,我在主活动中的super.OnCreate()之前获取此数据和setTheme()。按下菜单按钮后,我可以启动一个首选项活动。在更新首选项并按返回按钮返回到主要活动时,主题不会更新为新设置。仅关闭应用程序然后重新打开即可解决此问题。
在首选项活动中按返回按钮后,使主要活动更新并重新加载主题的最佳方法是什么?我尝试将setTheme()放在OnResume中,但无济于事。
非常感谢您的帮助,
感谢Ric
如果没有其他方法,可以在更新首选项后在活动中执行类似的操作:
Intent i = new Intent(this, YourActivity.class);
startActivity(i);
finish();
不太优雅,我希望有一种更简单的方法。
并且在主活动中在super.OnCreate()之前添加setTheme()
您永远不要在super.onCreate()或super.onResume()之前放置任何代码,所有代码都应放在这些调用之后。也许这是问题所在。
在您的活动中注册onsharedpreferencechange侦听器
这是我的操作方式:
我有一个可以在页面上选择多个主题的应用。通常,当选择一个主题然后按下“后退”按钮时,该主题将还原为上一个主题。这是一个问题。
我为onBackPressed()使用了@Override技巧来完成技巧。以下是代码(我还修改了stack [我的导航抽屉]中第一个活动的代码)。
@Override
public void onBackPressed()
{
Intent intent1 = new Intent(this, NavigationActivity.class);
startActivity(intent1);
super.onBackPressed(); // optional depending on your needs
}
主题切换活动中的该代码成功实现了,因此不会调用普通的后退按钮代码来破坏当前活动并恢复为旧主题。它只是传递给用户上一个活动,即我的NavigationActivity。对此进行自定义。
另一件事要注意的是,即使在此之后,后退按钮仍然会困扰您,因为一旦将我传递给NavigationActivity,如果再次按下后退按钮,主题就会还原。我调用了与以前相同的方法,但是我取出了导致还原的super.onBackPressed();
语句。它是这样的:
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
}
}
我希望这能帮到您!
如果使用导航组件,请按以下说明尝试。不需要调用intent或finishActivity。
override fun onBackPressed() {
when (navController.currentDestination?.id){
R.id.settingsFragment -> super.onSupportNavigateUp()
else -> super.onBackPressed()
}
}
super.onSupportNavigateUp()将解决您的后退导航问题。