Android 从后堆栈还原片段时的savedInstanceState

Android 从后堆栈还原片段时的savedInstanceState,android,android-fragments,bundle,back-stack,Android,Android Fragments,Bundle,Back Stack,是否可以使用savedInstanceState()在删除片段时保存状态,然后在从后堆栈弹出片段时恢复状态?当我从后堆栈还原片段时,savedInstanceState bundle始终为null 现在,应用程序流程是:fragment created->fragment removed(添加到后堆栈)->fragment restored from back stack(savedInstanceState bundle为null) 以下是相关代码: public void onActivit

是否可以使用
savedInstanceState()
在删除片段时保存状态,然后在从后堆栈弹出片段时恢复状态?当我从后堆栈还原片段时,savedInstanceState bundle始终为null

现在,应用程序流程是:fragment created->fragment removed(添加到后堆栈)->fragment restored from back stack(savedInstanceState bundle为null)

以下是相关代码:

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(),是否有其他方法解决此问题?

onSaveInstanceState(不幸的是)在片段的正常后堆栈重新创建中未被调用。查看并在

FWIW上找到答案,我也找到了这个,但在我的例子中,正确调用了onSaveInstanceState,当智能手机上出现新的活动片段时,我推送了我的状态数据。与您一样,onActivityCreated被称为w/savedInstanceState always null。我想这是一只虫子


我创建了一个静态MyApplication状态,并将数据放在那里作为“全局变量”的等价物。我喜欢将我返回的视图作为全局变量存储在onCreateView中,然后当我返回时,我只需检查以下内容:

if(mBaseView != null) {
        // Remove the view from the parent
        ((ViewGroup)mBaseView.getParent()).removeView(mBaseView);
        // Return it
        return mBaseView;
    }

问题是片段需要有一个与之关联的
Id
标记,以便
FragmentManager
跟踪它

至少有3种方法可以做到这一点:

  • 在xml布局中,为片段声明一个
    Id

    android:id=@+id/<Id>
    
  • 如果您的片段未与任何
    视图
    (例如无头片段)关联,请为其添加
    标记

    FragmentTransaction  add (Fragment fragment, String tag)
    

  • 我不确定这是个好主意。如果保存对视图的引用,是否会破坏视图以释放内存?我实际上不确定,因为我没有运行任何直接测试。然而,我的想法是这样的。在初始化布局中的所有元素时,标准的做法是将这些元素中的大多数设置为全局变量,因此,如果在上面的示例中,由于引用原因,我无法回收基本视图,Android也无法回收这些视图中的任何一个,因此导致了同样的内存问题。如果你需要为不同的方向膨胀不同的视图,这将不起作用。这个解决方案救了我的命。
    FragmentTransaction  add (Fragment fragment, String tag)