Intereting Posts
Как сделать липкие заголовки разделов (например, iOS) в Android? Сложный пример ListView со сложными данными и сложной компоновкой каждой строки? Android-джойстик для Android Studio, как приложение Gmail Android: сделанное фото больше, чем предварительный просмотр Как реализовать расширяемый элемент recyclerView (cardView)? Приемник вещания для Android не получает намерения Как эмулятор android может связаться с машиной-разработчиком хоста в eclipse? Доступность сообщений в Facebook Как автоматически принимать Wi-Fi Прямые запросы на подключение в Android scrollingCache? Как обращаться с уведомлением о появлении на Android, если он отображается автоматически GCM Java.lang.IllegalMonitorStateException: объект не заблокирован потоком перед ожиданием () Можно ли использовать GCM без учетной записи Google и сервисов Google Play на устройстве? Android build работает в Eclipse, но не с Ant («уже добавлено») Использование DiskLruCache в android 4.0 не предусматривает метод openCache

OnCreate () и onCreateView () вызывает намного больше, чем требуется (фрагменты)

Может кто-нибудь объяснить, почему функции onCreate() и onCreateView() вызываются столько раз, что увеличивается с каждым изменением ориентации?

Здесь очень простое приложение, состоящее из одного Activity состоящего из двух Fragments . Второй Fragment загружается динамически . Если вы определяете эти два Fragments в main.xml , такого поведения не было бы.

Вот 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()"); } } 

Log после нескольких изменений ориентации:

 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() 

Solutions Collecting From Web of "OnCreate () и onCreateView () вызывает намного больше, чем требуется (фрагменты)"

Я не могу указать на документацию, которая объясняет это, но решение состоит только в создании и добавлении фрагмента при первой загрузке активности, например:

 @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()"); } 

Да, это очень плохо документировано. Объяснение состоит в том, что при восстановлении Activity «автоматически restore Fragments которые были добавлены в него, поэтому adding другого Fragment в вашу Activity основном добавит еще один новый Fragment поверх предыдущего Fragment\s который фактически restored От Android .

Такое поведение определенно предназначено, и подход, предложенный @Joris Wit, является правильным.

Также это очень полезно, когда вы об этом думаете, потому что предположим, что у вас есть стек Fragments добавленных один поверх друг друга, и вы можете вернуться к ним с помощью back ключа. В случае поворота, если Android не восстановит стопку Fragments вы потеряете все из них или вам придется реализовать какой-то механизм для отслеживания stack Fragment .

Если вы не используете разные макеты для разных ориентаций, я думаю, что вы должны использовать android:configChanges="orientation" в вашем манифесте. http://developer.android.com/guide/topics/manifest/activity-element.html#config

Похоже, у вас так много фрагментов! Если вы определяете фрагмент в XML-файле, вы не можете определить его снова в своем коде! Существует два способа определить fragmets: dynamiclly (в вашем коде) и статически (в вашем xml)! Взгляните сюда: http://marakana.com/s/post/1250/android_fragments_tutorial

Это действительно хороший учебник.

Изменение ориентации заставляет систему проходить процесс сохранения состояния экземпляра, приостановки, остановки, уничтожения, а затем создания нового экземпляра операции с сохраненным состоянием. Так вот почему так много вызовов onCreate и onCreateView.

Я не думаю, что if (savedInstanceState == null) в методе onCreate является хорошей идеей; Механизм экономии штата не будет работать должным образом …

Основной класс должен расширять FragmentActivity, а не Activity.

Также посмотрите жизненный цикл активности на сайте android doc