Android SharedPreferences,主题和后退按钮

问题描述 投票:0回答:6

我有一个通过setTheme()设置主题的简单活动,主题ID存储在SharedPreferences中,我在主活动中的super.OnCreate()之前获取此数据和setTheme()。按下菜单按钮后,我可以启动一个首选项活动。在更新首选项并按返回按钮返回到主要活动时,主题不会更新为新设置。仅关闭应用程序然后重新打开即可解决此问题。

在首选项活动中按返回按钮后,使主要活动更新并重新加载主题的最佳方法是什么?我尝试将setTheme()放在OnResume中,但无济于事。

非常感谢您的帮助,

感谢Ric

android themes sharedpreferences back-button
6个回答
1
投票

参见此page

据Android框架工程师Dianne Hackborn:

您只能在创建。要应用主题,整个用户界面需要重新膨胀,从其资源重建。


0
投票

如果没有其他方法,可以在更新首选项后在活动中执行类似的操作:

Intent i = new Intent(this, YourActivity.class);
startActivity(i);
finish();

不太优雅,我希望有一种更简单的方法。


0
投票

并且在主活动中在super.OnCreate()之前添加setTheme()

您永远不要在super.onCreate()或super.onResume()之前放置任何代码,所有代码都应放在这些调用之后。也许这是问题所在。


0
投票

在您的活动中注册onsharedpreferencechange侦听器


0
投票

这是我的操作方式:

我有一个可以在页面上选择多个主题的应用。通常,当选择一个主题然后按下“后退”按钮时,该主题将还原为上一个主题。这是一个问题。

我为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);
    }
}

我希望这能帮到您!


0
投票

如果使用导航组件,请按以下说明尝试。不需要调用intent或finishActivity。

override fun onBackPressed() {
    when (navController.currentDestination?.id){
        R.id.settingsFragment -> super.onSupportNavigateUp()
        else -> super.onBackPressed()
    }
}

super.onSupportNavigateUp()将解决您的后退导航问题。

© www.soinside.com 2019 - 2024. All rights reserved.