我有一个活动MainActivity
,它在七个片段之间交换。片段没有特定的顺序,因此当应用程序启动并首次创建活动时,我将一个设置为默认/开始屏幕:
FragmentManager fm = getSupportFragmentManager();
Fragment fragment = fm.findFragmentById(R.id.fragmentDrawerContainer);
if (fragment == null)
{
fm.beginTransaction()
.add(R.id.fragmentDrawerContainer, new DefaultFragment())
.commit();
// An int I use to track which Fragment is currently being viewed,
// for navigation drawer purposes
mCurrentPosition = DEFAULT_FRAGMENT_POSITION;
}
在导航抽屉中,用户还可以转到新活动SettingsActivity
,其中托管PreferenceFragment
以更改某些设置,例如度量单位(公制与英制)和颜色主题。
// Standard navigation from one activity to another from inside selectItem() method of nav drawer
Intent intent = new Intent(this, SettingsActivity.class);
startActivity(intent);
一旦用户从MainActivity
导航回SettingsActivity
,无论是通过后退还是上行按钮,我都需要做两件事:
1)用户最后看到的片段仍然必须存在。目前,活动重新加载DefaultFragment
(因为正在重新创建活动,我认为)。
2)每个片段都包含自定义的View I,并且在用户从SharedPreferences
返回后,View必须使用SettingsActivity
中的值更新自身。
要解决#1,我尝试使用android:launchMode="singleTop"
,但是我无法刷新视图,除非我切换到另一个片段然后再回来。
我已尝试在片段的myView.invalidate()
方法中调用onResume()
,但它似乎无法正常工作。
有什么想法吗?如果我不清楚,请告诉我。提前谢谢!
答案 0 :(得分:0)
1)在MainActivity中使用onSaveInstanceState方法来保存当前片段。 在onCreate方法中恢复它。
public void onCreate(Bundle savedInstanceState) {
...
if (savedInstanceState != null) {
//Restore the fragment's instance
mContent = getSupportFragmentManager().getFragment(
savedInstanceState, "mContent");
...
}
...
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//Save the fragment's instance
getSupportFragmentManager().putFragment(outState, "mContent", mContent);
}
在片段中,通过覆盖onSaveInstanceState保存实例状态并在onActivityCreated上恢复:
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
...
if (savedInstanceState != null) {
//Restore the fragment's state here
}
}
...
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//Save the fragment's state here
}
检查this
2)在您的片段的onResume方法get中,您的共享首选项并将其设置为视图:
SharedPreferences preferences = this.getActivity().getSharedPreferences("pref", Context.MODE_PRIVATE);
String value = preferences .getString("key", "default_value");