Состояние фрагмента Android восстанавливается только на кнопке "Назад", а не когда я произвольно выбираю фрагмент из списка
Привет, у меня есть панель просмотра listview, и я показываю фрагменты на основе выбора пользователя в списке.
Вот как я заменяю фрагменты
public void switchFragment(Fragment fragment, boolean addBackStack) {
try {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
ft.replace(R.id.content, fragment);
currentFragment = fragment;
//if (addBackStack)
ft.addToBackStack(null);
ft.commit();
} catch (Exception e) {
}
}
Это мой пример кода фрагмента. Теперь, когда я заменяю фрагменты, я сохраняю состояние экземпляра в onpause и восстанавливаю его в onresume, но он работает только при нажатии кнопки возврата. Когда я вручную перехожу назад к фрагменту из списка, состояние фрагмента не восстанавливается. Почему?
public class Fragment1 extends BaseFragment {
int currentFragmentInd = 1;
private Button startButton;
private Button endButton;
private long savedStartTime;
private TextView setStartText;
private TextView setEndText;
private String starttime;
private String endtime;
public int getIndex() {
MyApplication.getApplication().setCurrentChild(0);
MyApplication.getApplication().setCurrentGroup(0);
return currentFragmentInd;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (savedInstanceState !=null)
{
}
}
@Override
public void onResume() {
super.onResume();
setStartText= (TextView)getActivity().findViewById(R.id.MAtextView2);
setEndText= (TextView)getActivity().findViewById(R.id.MAtextView3);
setEndText.setText(endtime);
setStartText.setText(starttime);
}
@Override
public void onPause() {
super.onPause();
setStartText= (TextView)getActivity().findViewById(R.id.MAtextView2);
setEndText= (TextView)getActivity().findViewById(R.id.MAtextView3);
starttime=setStartText.getText().toString();
endtime=setEndText.getText().toString();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
FrameLayout frameLayout;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View contentView = inflater.inflate(R.layout.layout1, null, false);
((MainActivity) getActivity()).openList(0, 0);
if (savedInstanceState == null) {
}
startButton= (Button) contentView.findViewById(R.id.button);
endButton= (Button) contentView.findViewById(R.id.button2);
endButton.setEnabled(false);
setStartText= (TextView)contentView.findViewById(R.id.MAtextView2);
setEndText= (TextView)contentView.findViewById(R.id.MAtextView3);
startButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Time now = new Time();
now.setToNow();
}
});
endButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Time now = new Time();
now.setToNow();
setEndText.setText(now.hour+" : "+now.minute);
}
});
return contentView;
}
}
Ответы
Ответ 1
Позднее воспроизведение, но может помочь кому-то другому.
Это происходит потому, что, когда вы нажимаете элемент listview, вы создаете новый компонент этого фрагмента.
"Я предполагаю, что фрагмент, который вы отправляете для switchFragment (фрагмент фрагмента), создается с использованием" нового "ключевого слова."
Поэтому этот новый экземпляр фрагмента не содержит ваши старые данные.
Вот как я это решил. Есть, вероятно, лучшие способы, но поскольку никто не ответил, я дам свое решение.
- Когда вы заменяете фрагмент (ft.replace, fragment), даете ссылку на эту транзакцию: -ft.replace(R.id.content, фрагмент, "FRAGMENT_NAME" );
- Когда вы добавляете фрагмент в backstack с помощью addToBackStack (null); введите имя вашего фрагмента, где у вас есть null.: -ft.addToBackStack( "FRAGMENT_NAME" );
-
Создайте метод, который сообщает вам, был ли этот фрагмент уже создан и, следовательно, существует в фоновом стеке.:
public boolean isTagInBackStack(String tag){
Log.i(TAG, "isTagInBackStack() Start");
int x;
boolean toReturn = false;
int backStackCount = getSupportFragmentManager().getBackStackEntryCount();
Log.i(TAG, "backStackCount = " + backStackCount);
for (x = 0; x < backStackCount; x++){
Log.i(TAG, "Iter = " + x +" "+ getSupportFragmentManager().getBackStackEntryAt(x).getName());
if (tag == getSupportFragmentManager().getBackStackEntryAt(x).getName()){
toReturn = true;
}
}
Log.i(TAG, "isTagInBackStack() End, toReturn = " + toReturn);
return toReturn;
}
-
Теперь перед созданием нового экземпляра проверки этого фрагмента в стоп-кадре, если существует элемент backstack с именем "FRAGMENT_NAME" .
если он существует, используйте этот элемент (фрагмент) вместо создания нового.
if (isTagInBackStack("FRAGMENT_NAME")){
Log.i(TAG, "Tag is in BackStack!!!! frag is = " + getSupportFragmentManager().findFragmentByTag("FRAGMENT_NAME"));
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.main_activity_container, getSupportFragmentManager().findFragmentByTag("FRAGMENT_NAME"));
transaction.addToBackStack("FRAGMENT_NAME");
transaction.commit();
}else{
Create the fragment (this happens the first time.
}