Intereting Posts
Доступ к базе данных SQLite из командной строки Возможно ли иметь простой библиотечный модуль java в зависимости от SDK Android в Android Studio Android – Как указать вес программно для RelativeLayout? Возврат входного потока из дескриптора файла пакета с использованием андроидов DownloadManager Как сделать кнопку «Edit» «Готово» Android и скрыть клавиатуру при нажатии? ActionBarCompat показывает каждое действие в меню переполнения Функция оптимизации Google Play предлагает перевод на английский (США) на английский (Великобритания) Цвет стиля CSS неэффективен по звездному персонажу (& # 9733;) на Samsung с Android 4.4 KitKat Что означает authTokenType? Можем ли мы публиковать в Google плюс приложение для Android? Использование SDK Cardboard в Unity 5 – нет событий касания? Вложенный внутренний класс активности в android Не может вызвать String.isEmpty () в android Кнопки Eclipse, такие как «Ввод, выключение, возобновление и т. Д.», Не работает Загрузите прогресс с помощью RxJava, OkHttp и Okio в Android

Фрагмент вращения экрана

Я добавил viewpager к активности, которая содержит две страницы.

В onCreate of activity я добавляю фрагменты к фрагментуAdapter:

public void onCreate(Bundle savedInstanceState) { ...... FragmentAdapter fragmentAdapter = new FragmentAdapter ( getSupportFragmentManager(), new Fragment[]{FragmentGame.builder(id), FragmentComments.builder(id)}, new String[]{getString(R.string.gameInfo), getString(R.string.comments)} ); ViewPager viewPager = (ViewPager) findViewById(R.id.viewPager); viewPager.setAdapter(fragmentAdapter); public static FragmentGame builder(long id) { FragmentGame fragmentGame = new FragmentGame(); // fragmentGame.id = id; Bundle bundle = new Bundle(); bundle.putLong(Constants.EXTRA_ID, id); fragmentGame.setArguments(bundle); return fragmentGame; } 

В первый раз, когда эта активность создана, onCreateView фрагмента называется так, как ожидается.

Странное поведение – когда экран поворачивается в первый раз, когда onCreateView фрагмента вызывается дважды, но второй вызов имеет только правильный идентификатор, а для первого идентификатора вызова – 0.

При втором повороте экрана onCreateView вызывается три раза, и снова только последний имеет id.

Чем больше поворот экрана, тем больше увеличиваются вызовы onCreateView .

Я нашел некоторые связанные вопросы о фрагменте и вращении экрана, но я не могу понять, почему это происходит и как это сделать правильно.

—– ОБНОВИТЬ ——

Проблема с идентификатором решена, поскольку я заменил узел с установкой прямого значения.

Solutions Collecting From Web of "Фрагмент вращения экрана"

Каждый раз, когда вы поворачиваете свое устройство, вы создаете новый фрагмент и добавляете его в FragmentManager.

Все ваши ранее созданные фрагменты все еще находятся в FragmentManager, поэтому счет увеличивается на единицу каждый раз.

Если вы хотите сохранить значение в своем фрагменте, вам нужно сохранить его в аргументах, иначе любые значения, которые он содержит, будут потеряны, когда система заново создаст фрагмент.

 public static FragmentGame builder(long id) { Bundle args = new Bundle(); args.putInt("id", id); fragmentGame f = new fragmentGame(); f.setArguments(args); } 

Вместо того, чтобы создавать новый фрагмент, я подозреваю, что вы действительно хотите получить свой ранее созданный при повороте устройства. Используйте getSupportFragmentManager().findFragmentById() или getSupportFragmentManager().findFragmentByTag() для этого.

Изменить: дополнительный код

  // Add fragment to the manager FragmentTransaction trans=getSupportFragmentManager().beginTransaction(); trans.add(f,"myTag"); trans.commit(); // retrieve the fragment Fragment f= getSupportFragmentManager().findFragmentByTag("myTag"); 

Просто попробуйте извлечь фрагмент, если значение равно null, создайте новый фрагмент и добавьте его в диспетчер, иначе используйте извлеченный.

Если вы не хотите перезагружать фрагмент при изменении ориентации, напишите следующее для активности, в которой вы загружаете фрагмент в файле манифеста.

 <activity android:name="your activity name" android:configChanges="orientation|screenSize" // add this to your activity android:label="@string/app_name"> </activity>