我已经搜索过了,但没有找到任何东西,这可以帮助我解决我的问题,我的代码中,我有一个SpaceNavigationView(像BottomNavigationView一样),有五个Fragments。在我的代码中,我有一个SpaceNavigationView(像BottomNavigationView),有五个Fragment。
所以在Fragment A中,我放了一个Recyclerview。如果Recyclerview中的一个项目被点击,它将用一个新的子片段B替换当前片段。
在片段B中,我设置了一个Chronometer,当它被按下时,它应该计算时间。现在,如果我从片段B切换到片段C,再回到片段B,Chronometer以零开始,因为片段被替换了。
我试着使用onSaveInstanceState,以便在重新创建Fragment时调用它,但这对我来说并不奏效。
这是HomeActivity的一部分,其中包括所有的Fragment。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
init();
setFragment(fragmentHome);
navigationView.initWithSaveInstanceState(savedInstanceState);
navigationView.addSpaceItem(new SpaceItem("", R.drawable.bottom_baby));
navigationView.addSpaceItem(new SpaceItem("", R.drawable.bottom_advise));
navigationView.addSpaceItem(new SpaceItem("", R.drawable.ic_favorite_black_24dp));
navigationView.addSpaceItem(new SpaceItem("", R.drawable.ic_settings));
navigationView.setSpaceOnClickListener(new SpaceOnClickListener() {
@Override
public void onCentreButtonClick() {
setFragment(fragmentPlayground);
navigationView.setCentreButtonSelectable(true);
}
@Override
public void onItemClick(int itemIndex, String itemName) {
switch (itemIndex) {
case 0:
setFragment(fragmentHome);
return;
case 1:
setFragment(fragmentAdvising);
return;
case 2:
setFragment(fragmentMemories);
return;
case 3:
setFragment(fragmentSettings);
return;
default:
setFragment(fragmentHome);
return;
}
}
@Override
public void onItemReselected(int itemIndex, String itemName) {
Toast.makeText(HomeActivity.this, itemIndex + " " + itemName, Toast.LENGTH_SHORT).show();
}
});
}
private void setFragment(Fragment fragment) {
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.container, fragment);
fragmentTransaction.commit();
}
所以,如果我现在导航到FragmentHome,并使用OnClickListener for Reycleritems,我将切换到Fragment_Chronograph。
@Override
public void onItemClick(int position) {
switch (position) {
case 0:
getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment_chronograph).commit();
}
所以现在我在Fragment_Chronograph中,想为Chronograph保存基础。我将在onSavedInstanceState中保存变量,当Activity被暂停时,它会被调用。
@Override
public void onSaveInstanceState(@NonNull Bundle outState) {
startTime = SystemClock.elapsedRealtime() - chronometerLeft.getBase();
outState.putLong(CHRONOLEFT_TIME_SAVE_ID,startTime);
super.onSaveInstanceState(outState);
@Override
public void onPause() {
super.onPause();
onSaveInstanceState(new Bundle());
}
最后,我把这个代码放在OnCreate方法中进行还原。
if (savedInstanceState != null) {
startTime = savedInstanceState.getLong(CHRONOLEFT_TIME_SAVE_ID,0);
chronometerLeft.setBase(startTime - SystemClock.elapsedRealtime());
chronometerLeft.start();
OnSaveInstanceState被调用, 但在OnCreate方法中它不会被调用. 如果有人能帮我解决这个问题,我将非常感谢。我找了好几天都没有找到解决办法。
在设置fragment方法中,首先找到有id的fragment,然后检查它是否不是空的,替换掉它。
Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_PLACEHOLDER);
if (fragment == null) {
fragment = new PlaceholderFragment();
}
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.container, fragment, TAG_PLACEHOLDER)
.commit();
注意:您必须在您的片段中添加标签。
@Arvin
FragmentHome是在init()方法中启动的。
private void init() {
navigationView = findViewById(R.id.space);
fragmentHome = new FragmentHome();
fragmentAdvising = new FragmentAdvising();
fragmentMemories = new FragmentMemories();
fragmentSettings = new FragmentSettings();
fragmentPlayground = new FragmentPlayground();
============= UPDATE =================
Problem was solved. I didn't have to use OnSavedInstanceState. I used a Helperclass to store the variable of the Chronometerbase. In OnCreate method i check if the variable is not null, then restore the before saved base.