当用户在我的应用上打开首选项时,他可能会进行更改,例如更改应用主题。
ContextThemeWrapper.setTheme(int)
的文档说:
为此上下文设置基本主题。请注意,应在上下文中实例化任何视图之前调用此方法(例如在调用
setContentView(View)
或inflate(int, ViewGroup)
之前)。
所以我首先想到的是当用户更改首选项时重新启动应用onResume()
。但是我注意到,有时重新启动活动的过程是无缝的,而有时活动关闭,主屏幕就会出现,并且只有在几秒钟后应用再次打开。
我想知道是否有办法改变处理首选项的变化。例如,在onResume
之后更改主题而不重新启动活动或在用户处于首选项时在后台重新启动活动。
处理此问题的正确方法是什么?
答案 0 :(得分:5)
假设您的Preference
屏幕是Activity
,当用户导航到该屏幕时,MainActivity
被置于paused
状态(然后可能位于stopped
1}}状态)。用户导航回MainActivity
时会调用onResume()
;在这里,您可以相应地更改MainActivity
的状态以反映已更改的首选项。
答案 1 :(得分:3)
我假设您在App Preferences中存储用户选择的主题。因此,在您的活动onCreate()
中,添加setTheme()
。
public void onCreate(Bundle savedInstanceState) {
setTheme(android.R.style.Theme); // or whatever theme you're using
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
但是,在重新启动活动之前,更改不会生效。因此,如果您需要立即应用主题更改,请在应用主题后调用recreate()
:
// Might need to call them on getApplication() depending on Context
setTheme(userSelectedTheme);
recreate();
此外,作为Attiq mentioned,重新创建活动可能会导致使用Threads / AsyncTasks从网络中获取数据丢失,因此您也需要考虑这一点。
答案 2 :(得分:1)
When a user opens preferences on my app he may make changes that mean I have to restart my MainActivity however I don't want to user to notice anything happened.
用户不会注意到任何事情,因为活动生命周期会照顾。
任务 - EVENT 1 主要活动(MA)TO
偏好活动(PA)
EVENT 2 偏好活动(PA)TO
主要活动
活动生命周期 - MA onPause()TO PA onResume()... PA onPause()TO MA onResume()
nor remove it from the back stack.
如果您希望从Backstack恢复相同的活动而不是要创建新的MainActivity,可以使用 launchmodes
来完成代码示例
intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP);
startActivity(intent);
答案 3 :(得分:1)
我们的应用程序提供了多个主题,我们已经尝试了从onResume或onStart [restart activity case]更新主题的方法,但是它需要onCreate()方法调用来更新主题,你需要完成活动并使用选定的主题重新创建它。
重点:重新创建新活动可能会导致使用活动中的线程或asynctask从网络中获取数据丢失,因此您也需要解决此问题。
在我们的应用程序中,我们在共享首选项中保存所选主题的数量,并在创建新活动期间加载它。
完成并重新启动活动
public static void changeToTheme(Activity activity, int theme) {
sTheme = theme;
activity.finish();
activity.startActivity(new Intent(activity, activity.getClass()));
}