onCreate()和onCreateView()会调用比需要更多的(Fragments)

有人可以解释为什么onCreate()onCreateView()被调用这么多次,每个方向的变化增加?

这里是非常简单的应用程序,它由一个由两个Fragments组成的Activity组成。 第二个Fragment dynamic加载。 如果你在main.xml定义这两个Fragments ,就不会有这样的行为。

这里是main.xml

  <fragment class="ets.saeref.Left" android:id="@+id/left_frag" android:layout_weight="70" android:layout_width="match_parent" android:layout_height="match_parent"/> <FrameLayout android:id="@+id/right_frag" android:layout_weight="30" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout> 

这是左边的碎片:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#000000"> <Button android:text="Landscape" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> </LinearLayout> 

这是对的碎片:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#ffffff"> <Button android:text="Landscape" android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button> </LinearLayout> 

Left.class:

 public class Left extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i("Left", "onCreate()"); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.i("Left", "onCreateView()"); return inflater.inflate(R.layout.left, container, false); } } 

Right.class:

 public class Right extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.i("Right", "onCreate()"); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.i("Right", "onCreateView()"); return inflater.inflate(R.layout.right, container, false); } } 

主要课程:

 public class Main extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Fragment fg = new Right(); getFragmentManager().beginTransaction().add(R.id.right_frag, fg) .commit(); Log.i("Main", "onCreate()"); } } 

logging几个方向更改:

 08-28 21:47:38.220: INFO/Main(1099): onCreate() 08-28 21:47:38.220: INFO/Right(1099): onCreateView() 08-28 21:47:38.220: INFO/Right(1099): onCreateView() 08-28 21:47:38.220: INFO/Right(1099): onCreateView() 08-28 21:47:38.220: INFO/Right(1099): onCreate() 08-28 21:47:38.220: INFO/Right(1099): onCreateView() 08-28 21:47:41.110: INFO/ActivityManager(142): Config changed: {1.0 0mcc0mnc en_US sw800dp w1280dp h752dp xlrg land finger -keyb/v/h -nav/h s.162} 08-28 21:47:41.140: INFO/Right(1099): onCreate() 08-28 21:47:41.140: INFO/Right(1099): onCreate() 08-28 21:47:41.140: INFO/Right(1099): onCreate() 08-28 21:47:41.140: INFO/Right(1099): onCreate() 08-28 21:47:41.170: INFO/Left(1099): onCreate() 08-28 21:47:41.170: INFO/Left(1099): onCreateView() 08-28 21:47:41.170: INFO/Main(1099): onCreate() 08-28 21:47:41.170: INFO/Right(1099): onCreateView() 08-28 21:47:41.170: INFO/Right(1099): onCreateView() 08-28 21:47:41.170: INFO/Right(1099): onCreateView() 08-28 21:47:41.170: INFO/Right(1099): onCreateView() 08-28 21:47:41.190: INFO/Right(1099): onCreate() 08-28 21:47:41.190: INFO/Right(1099): onCreateView() 08-28 21:47:45.070: INFO/ActivityManager(142): Config changed: {1.0 0mcc0mnc en_US sw800dp w800dp h1232dp xlrg port finger -keyb/v/h -nav/h s.163} 08-28 21:47:45.120: INFO/Right(1099): onCreate() 08-28 21:47:45.120: INFO/Right(1099): onCreate() 08-28 21:47:45.120: INFO/Right(1099): onCreate() 08-28 21:47:45.120: INFO/Right(1099): onCreate() 08-28 21:47:45.120: INFO/Right(1099): onCreate() 08-28 21:47:45.130: INFO/Left(1099): onCreate() 08-28 21:47:45.130: INFO/Left(1099): onCreateView() 08-28 21:47:45.130: INFO/Main(1099): onCreate() 08-28 21:47:45.130: INFO/Right(1099): onCreateView() 08-28 21:47:45.130: INFO/Right(1099): onCreateView() 08-28 21:47:45.130: INFO/Right(1099): onCreateView() 08-28 21:47:45.140: INFO/Right(1099): onCreateView() 08-28 21:47:45.140: INFO/Right(1099): onCreateView() 08-28 21:47:45.140: INFO/Right(1099): onCreate() 08-28 21:47:45.140: INFO/Right(1099): onCreateView() 

我不能指出解释这个的文档,但解决scheme是只在活动首次加载时创build和添加片段,如下所示:

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); if (savedInstanceState == null) { Fragment fg = new Right(); getFragmentManager().beginTransaction().add(R.id.right_frag, fg) .commit(); } Log.i("Main", "onCreate()"); } 

是的,这是非常糟糕的logging。 解释是当Activityrestored它会自动restore其中添加的Fragments ,所以在Activity adding另一个Fragment基本上会在前面Fragment\s顶部添加一个新的Fragment ,由Android

这种行为是绝对有意的,@Joris Wit提出的方法是正确的。

当你考虑这一点时,这也是非常有用的,因为假设你有一堆Fragments叠加,你可以使用back键导航回去。 在轮换的情况下,如果Android不会恢复Fragments的后台堆栈,你将会失去所有的Fragment stack ,或者你将不得不实现一些机制来跟踪你的Fragment stack

如果您对不同的方向使用不同的布局,我认为您应该在清单中使用android:configChanges="orientation"http://developer.android.com/guide/topics/manifest/activity-element.html#config

看起来你有那么多碎片! 如果在xml文件中定义片段, 则不能在代码中再次定义“it”! 有两种方式定义fragmets:dynamiclly(在你的代码中)和静态的 (在你的xml中)! 看看这里: http : //marakana.com/s/post/1250/android_fragments_tutorial

这是一个很好的教程。

定位更改会导致系统执行保存实例状态,暂停,停止,销毁,然后创build具有保存状态的活动的新实例。 所以这就是为什么有这么多onCreate和onCreateView调用的原因。

我不认为onCreate方法中的if (savedInstanceState == null)条件是一个好主意, 国家节约机制将无法正常工作…

主类应该扩展FragmentActivity而不是Activity。

也查看Android文档上的Activity生命周期