我有一个应用程序。那就是使用Fragments。主要活动以2片段开头。其中一个片段包含一个按钮,用于在运行时添加第3个片段,如下所示:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Activity activity = getActivity();
if (fragment3 == null) {
getFragmentManager()
.beginTransaction()
.add(R.id.fragment_content3, new ThirdFragment())
.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
.commit();
}
ThirdFragment类看起来像这样:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.v(getTag(), "FRAG onCreate CALLED!");
this.setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.third_fragment, container, false);
return view;
问题是我无法理解如何在重新创建Activity时保持此片段的视图不被删除。我试图@Override onCreate()方法并使用setRetainInstance(true)无济于事。
所以,我的问题是:
在重新创建Activity时,保持动态(在运行时)添加的Fragment被删除的正确方法是什么?
答案 0 :(得分:0)
在这种情况下,您可以通过实施额外的回调方法来确保保留有关活动状态的重要信息,该方法允许您保存有关活动状态的信息:
onSaveInstanceState()
。在使活动易受破坏之前,系统会调用
onSaveInstanceState()
。系统将此方法传递给Bundle,在该方法中,您可以使用putString()和putInt()等方法将有关活动的状态信息保存为名称 - 值对。然后,如果系统终止您的应用程序进程并且用户导航回您的活动,系统将重新创建活动并将Bundle传递给onCreate()
和onRestoreInstanceState()
。使用这些方法之一,您可以从Bundle中提取已保存的状态并恢复活动状态。如果没有要恢复的状态信息,那么传递给您的Bundle为null(这是第一次创建活动时的情况)。Android Documentation
<强>解决方案:强>
因此,在方法onSaveInstanceState()
中只有一个包来保存有关您的片段的信息,并且片段是一个复杂的对象,您不能将它直接存储在该包中。
我的建议是@override onSaveInstanceState()
并使用boolean
标志来指示您的第三个片段是否应该附加(可见)。很快,您可以使用OnCreate() or onRestoreInstanceState()
并获取包以阅读您的标志,并根据它,您可以创建或不创建您的片段。