有一些类似的答案,但不是针对这种情况。
我的情况很简单。
我有一个具有两种不同布局的活动,一种是纵向的,另一种是横向的。
在Portrait中,我使用并动态<FrameLayout>
添加Fragment
它。
在Landscape中,我使用<fragment>
的Fragment
是静态的。(其实这无关紧要)
它首先从Portrait开始,然后我Fragment
简单地添加了:
ListFrag listFrag = new ListFrag();
getSupportFragmentManager().beginTransaction()
.replace(R.id.FragmentContainer, listFrag).commit();
哪里ListFrag extends ListFragment
。
然后我做一个屏幕旋转。我发现 listFrag 正在横向模式下重新创建。
(在其中我注意到该onCreate()
方法再次使用非空包调用)
我试着setRetainInstance(false)
像@NPike 在这篇文章中所说的那样使用。但是默认情况下getRetainInstance()
已经false
是。正如文档所说,它没有达到我的预期。谁能解释一下?
我正在处理的片段是 a ListFragment
,它setListAdapter()
在onCreate()
. 所以这里不能使用该if (container == null) return null;
方法。(或者我不知道如何申请)。
我从这篇文章中得到了一些提示。我应该if (bundle != null) setListAdapter(null); else setListAdapter(new ...);
在我的ListFragment
? 但是,有没有更好的方法在片段被销毁/分离时确实删除/删除片段,而不是在创建时执行它?(if (container == null) return null;
方法如此)
编辑:
我发现的唯一整洁的方法是getSupportFragmentManager().beginTransaction().remove(getSupportFragmentManager().findFragmentById(R.id.FragmentContainer)).commit();
在onSaveInstanceState()
. 但这会引发另一个问题。
当屏幕被部分遮挡时,例如弹出 WhatsApp 或 TXT 对话框,该片段也会消失。(这是相对较小的,只是视觉问题)
当屏幕旋转时,Activity 被完全销毁并重新创建。
onCreate(Bundle)
所以我可以在or中重新添加片段onRestoreInstanceState(Bundle)
。但是在(1)的情况下,以及切换活动,当用户返回我的活动时,既onCreate(Bundle)
不会也不会被调用。onRestoreInstanceState(Bundle)
我无处可重新创建 Activity(并从 Bundle 中检索数据)。
对不起,我没有说清楚,我已经有了一个决策,该getSupportFragmentManager()...replace(...).commit();
行仅在纵向模式下运行。
示例代码
我已经提取了简单的代码,以便更好地说明情况:)
MainActivity.java
package com.example.fragremovetrial;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (findViewById(R.id.FragmentContainer) != null) {
System.out.println("-- Portrait --"); // Portrait
ListFrag listFrag = new ListFrag();
getSupportFragmentManager().beginTransaction()
.replace(R.id.FragmentContainer, listFrag).commit();
} else {
System.out.println("-- Landscape --"); // Landscape
}
}
@Override
protected void onResume() {
super.onResume();
if (findViewById(R.id.FragmentContainer) != null) {
System.out.println("getRetainInstance = " +
getSupportFragmentManager().findFragmentById(R.id.FragmentContainer).getRetainInstance());
}
}
}
布局/activity_main.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/FragmentContainer"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
layout-land/activity_main.xml (没关系)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
</LinearLayout>
ListFrag.java
package com.example.fragremovetrial;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.widget.ArrayAdapter;
public class ListFrag extends ListFragment {
private String[] MenuItems = { "Content A", "Contnet B" };
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.out.println("ListFrag.onCreate(): " + (savedInstanceState == null ? null : savedInstanceState));
setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, MenuItems));
}
}
注意我得到了以下
调试消息
-- Portrait --
ListFrag.onCreate(): null
getRetainInstance = false
(rotate Port -> Land)
ListFrag.onCreate(): Bundle[{android:view_state=android.util.SparseArray@4052dd28}]
-- Landscape --
以前焦点视图在保存期间报告 id 16908298,但在恢复期间找不到。
(rotate Land -> Port)
ListFrag.onCreate(): Bundle[{android:view_state=android.util.SparseArray@405166c8}]
-- Portrait --
ListFrag.onCreate(): null
getRetainInstance = false
(rotate Port -> Land )
ListFrag.onCreate(): Bundle[{android:view_state=android.util.SparseArray@4050fb40}]
-- 风景 --
以前聚焦的视图在保存期间报告了 id 16908298,但在恢复期间找不到。
(rotate Land -> Port)
ListFrag.onCreate(): Bundle[{android:view_state=android.util.SparseArray@40528c60}]
-- Portrait --
ListFrag.onCreate(): null
getRetainInstance = false
随着屏幕不断旋转,创建的片段数量不会无限增加,我无法解释。(请帮忙)