Вопрос по bundle, android-fragments, android, back-stack – saveInstanceState при восстановлении фрагмента из заднего стека

36

Могу ли я использоватьsavedInstanceState() сохранить состояние при удалении фрагмента, а затем восстановить состояние при извлечении фрагмента из заднего стека? Когда я восстанавливаю фрагмент из заднего стека, комплект saveInstanceState всегда равен нулю.

Прямо сейчас поток приложения: фрагмент создан - & gt; фрагмент удален (добавлен в задний стек) - & gt; Фрагмент восстановлен из заднего стека (комплект saveInstanceState равен нулю)

Вот соответствующий код:

public void onActivityCreated(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Bundle bundle = getArguments();
    Long playlistId = bundle.getLong(Constants.PLAYLIST_ID);
    int playlistItemId = bundle.getInt(Constants.PLAYLISTITEM_ID);

    if (savedInstanceState == null) {
       selectedVideoNumber = playlistItemId;
    } else {
       selectedVideoNumber = savedInstanceState.getInt("SELECTED_VIDEO");
    }
}

public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putInt(Constants.SELECTED_VIDEO, selectedVideoNumber);
    }

Я думаю, проблема в том, чтоonSavedInstanceState() никогда не вызывается при удалении и добавлении в задний стек. Если я не могу использовать onsavedInstanceState (), есть ли другой способ исправить это?

Ваш Ответ

4   ответа
0

я ударил это тоже, но в моем случае onSaveInstanceState был вызван должным образом, и я нажал на мои данные о состоянии, когда новый фрагмент деятельности был поднят на смартфоне. Как и у вас, onActivityCreated был вызван w / saveInstanceState всегда null. ИМХО, я думаю, что это ошибка.

Я обошел его, создав статическое состояние MyApplication и поместив туда данные для эквивалента «глобальных переменных» ...

3

Id или жеTag связано с этим для того, чтобыFragmentManager следить за этим.

Есть как минимум 3 способа сделать это:

In xml layout declare an Id for your fragment:

android:[email protected]+id/<Id>

If your fragments container View has an Id, use FragmentTransaction:

FragmentTransaction  add (int containerViewId, Fragment fragment)

If your fragment is not associated with any View (e.g. headless fragment), give it a Tag:

FragmentTransaction  add (Fragment fragment, String tag)

Также посмотрите этот ТАК ответ.

6
5

которое я возвращаю в onCreateView, как глобальную переменную, а затем, когда я возвращаюсь, я просто проверяю это:

if(mBaseView != null) {
        // Remove the view from the parent
        ((ViewGroup)mBaseView.getParent()).removeView(mBaseView);
        // Return it
        return mBaseView;
    }
Это решение спасло мне жизнь.
не уверен, что это хорошая идея. Не противоречит ли это цели уничтожения представления, чтобы освободить память, если вы сохраните ссылку на него?
Это не сработает, если вам нужно раздувать разные взгляды для разных ориентаций.
Большое спасибо :) Это решило мою проблему
Я на самом деле не уверен, так как я не проводил никаких прямых тестов. Тем не менее, мое мышление идет так. Когда вы инициализируете все элементы в макете, это стандартно для установки большинства этих элементов в качестве глобальных переменных, поэтому, если в приведенном выше примере я не смогу перезапустить базовый вид из-за ссылки, Android не сможет перезапустить любой из этих видов либо, что приводит к той же проблеме с памятью.

Похожие вопросы