2016-01-22 1 views
0

У меня есть фрагмент в действии, и когда устройство повернуто, вызывается onSaveInstanceState() и onViewStateRestored().Проблемы с getSavedInstanceState() и onViewStateRestored() bundle

onSaveInstanceState():

@Override 
public void onSaveInstanceState(Bundle outState){ 
    Log.e("Fragment", "Called onSaveInstanceState"); 

    outState = getSavedInstanceState(); 

    super.onSaveInstanceState(outState); 
} 

Это то, что отличает сверток outState в onSaveInstanceState():

public static Bundle getSavedInstanceState(){ 
    Bundle saveState = new Bundle(); 

    //Save view states 
    saveState.putBoolean("startButtonVisible", buttonStart.getVisibility() == View.VISIBLE); 
    saveState.putBoolean("stopButtonVisible", buttonStop.getVisibility() == View.VISIBLE); 
    saveState.putBoolean("resetButtonVisible", buttonReset.getVisibility() == View.VISIBLE); 
    saveState.putBoolean("saveButtonVisible", buttonSave.getVisibility() == View.VISIBLE); 
    saveState.putBoolean("openLatestFileButtonVisible", buttonOpenLatestFile.getVisibility() == View.VISIBLE); 

    saveState.putBoolean("editTextStartValueVisible", editTextStartValue.isEnabled()); 
    saveState.putBoolean("buttonStartValueDownVisible", buttonStartValueDown.isEnabled()); 
    saveState.putBoolean("buttonStartValueUpVisible", buttonStartValueUp.isEnabled()); 
    saveState.putBoolean("editTextEndValueVisible", editTextEndValue.isEnabled()); 
    saveState.putBoolean("buttonEndValueDownVisible", buttonEndValueDown.isEnabled()); 
    saveState.putBoolean("buttonEndValueUpVisible", buttonEndValueUp.isEnabled()); 

    return saveState; 
} 

Это сохраняет данные правильно, однако при onViewStateRestored() вызывается, данные неверен.

@Override 
public void onViewStateRestored(Bundle savedInstanceState){ 
    Log.e("Fragment", "Called onViewStateRestored"); 

    super.onViewStateRestored(savedInstanceState); 

    //Restore view states 
    if (savedInstanceState != null){ 

     restoreInstanceState(savedInstanceState); 

     if (buttonReset.getVisibility() == View.VISIBLE){ 
      updateUi(); 
     } 
    } 
} 

Когда onViewStateRestored() вызывается, он также называет restoreInstanceState(), которая является то, что, как предполагается восстановить состояние каждого вида.

public static void restoreInstanceState(Bundle savedInstanceState){ 
    buttonStart.setVisibility(savedInstanceState.getBoolean("startButtonVisible") ? View.VISIBLE : View.INVISIBLE); 
    buttonStop.setVisibility(savedInstanceState.getBoolean("stopButtonVisible") ? View.VISIBLE : View.INVISIBLE); 
    buttonReset.setVisibility(savedInstanceState.getBoolean("resetButtonVisible") ? View.VISIBLE : View.INVISIBLE); 
    buttonSave.setVisibility(savedInstanceState.getBoolean("saveButtonVisible") ? View.VISIBLE : View.INVISIBLE); 
    buttonOpenLatestFile.setVisibility(savedInstanceState.getBoolean("openLatestFileButtonVisible") ? View.VISIBLE : View.INVISIBLE); 

    editTextStartValue.setEnabled(savedInstanceState.getBoolean("editTextStartValueVisible")); 
    buttonStartValueDown.setEnabled(savedInstanceState.getBoolean("buttonStartValueDownVisible")); 
    buttonStartValueDown.setImageResource(buttonStartValueDown.isEnabled() ? R.drawable.ic_arrow_down : R.drawable.ic_arrow_down_gray); 
    buttonStartValueUp.setEnabled(savedInstanceState.getBoolean("buttonStartValueUpVisible")); 
    buttonStartValueUp.setImageResource(buttonStartValueUp.isEnabled() ? R.drawable.ic_arrow_up : R.drawable.ic_arrow_up_gray); 
    editTextEndValue.setEnabled(savedInstanceState.getBoolean("editTextEndValueVisible")); 
    buttonEndValueDown.setEnabled(savedInstanceState.getBoolean("buttonEndValueDownVisible")); 
    buttonEndValueDown.setImageResource(buttonEndValueDown.isEnabled() ? R.drawable.ic_arrow_down : R.drawable.ic_arrow_down_gray); 
    buttonEndValueUp.setEnabled(savedInstanceState.getBoolean("buttonEndValueUpVisible")); 
    buttonEndValueUp.setImageResource(buttonEndValueUp.isEnabled() ? R.drawable.ic_arrow_up : R.drawable.ic_arrow_up_gray); 

    Log.e("Fragment", "Restored view visibility"); 
} 

Почему данные неверны при вызове onViewStateRestored()? Все взгляды становятся невидимыми независимо от того, кем они были раньше. Являются ли пучки не одинаковыми при сохранении и восстановлении состояний?

Весь этот код, однако, работает при вызове fragmentManager.beginTransaction().replace(R.id.content_frame, CustomFragmentManager.savedFilesFragment).commit();, а затем вызывает onViewStateRestored() вручную.

EDIT: Измененные имена полей.

Решение: я заменил outState = new Bundle(getSavedInstanceState()); с outState.putAll(getSavedInstanceState()); и сейчас работает. Вызов setRetainInstance(true); не требовался.

+0

Что делает 'updateUi()' do? – AutonomousApps

ответ

2

Вы не должны создавать государственный пакет вручную самостоятельно, используя outState объект, который передается в метод onSaveInstanceState() и восстановление в OnCreate(). Дополнительно, вы вызываете setRetainInstance (true) в свой фрагмент onCreate().

0

Я подозреваю, что это связано с вашими сигнатурами метода. Почему вы используете static? Статический метод не может получить доступ к членам экземпляра. Это:

public static Bundle getSavedInstanceState() 
public static void restoreInstanceState(Bundle savedInstanceState) 

Должно быть:

public Bundle getSavedInstanceState() 
public void restoreInstanceState(Bundle savedInstanceState) 

Во-вторых, ваши имена полей страшно не-Java-как. Это:

BTN_startValueDown 

Должно быть (например):

btnStartValueDown 

Первое редактирование

Если бы подумать об этом раньше. Поскольку вы просто пытаетесь сохранить состояние фрагмента, просто позвоните setRetainInstance(true) в свой фрагмент onCreate(). См. here.

Второй редактировать

Другой ответивший правильно, вы не должны создавать другую Bundle для амбулаторного государства.Если вы действительно хотите создать этот сверток в отдельный метод, используйте вместо этого:

outState.putAll(getSavedInstanceState()); 
+0

Я попытался сделать оба метода нестационарными, но, похоже, это не имеет никакого эффекта. – TychoTheTaco

 Смежные вопросы

  • Нет связанных вопросов^_^