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。 解释是当Activity
被restored
它会自动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生命周期