Изменено состояние восстановления фрагментов по ориентации
Я должен реализоватьStandart» навигация по фрагментам в моем приложении (смотритессылка на сайт).
Проблема в том, что когда устройство находится в портретном режиме, должен отображаться только 1 фрагмент, а при его повороте в альбомный режим должны отображаться 2 фрагмента.
Я пытался сделать это 2 разными способами:
1) Я использую только 1 упражнение с разным портретным и ландшафтным расположением.
Портретная верстка xml:
А вот и ландшафтный макет:
Activity`sOnCreate метод:
private static ItemsFragment mItemsFragment;
private static ItemDetailsFragment mItemDetailsFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (mItemsFragment == null) {
mItemsFragment = ItemsFragment.newInstance();
}
if (mItemDetailsFragment == null) {
mItemDetailsFragment = ItemDetailsFragment.newInstance();
}
if (isLandscape()) {
getSupportFragmentManager().beginTransaction().replace(R.id.main_frame_fragment_container_left, mItemsFragment)
.commit();
getSupportFragmentManager().beginTransaction()
.replace(R.id.main_frame_fragment_container_right, mItemDetailsFragment).commit();
} else {
getSupportFragmentManager().beginTransaction().replace(R.id.main_frame_fragment_container, mItemsFragment)
.commit();
}
}
И вот так я обновляю второй фрагмент:
Bundle bundle = new Bundle();
bundle.putSerializable(BaseFragment.KEY_BUNDLE_ITEM, response.getItem());
mItemDetailsFragment = ItemDetailsFragment.newInstance(bundle);
if (isLandscape()) {
getSupportFragmentManager().beginTransaction()
.replace(R.id.main_frame_fragment_container_right, mItemDetailsFragment).commit();
} else {
getSupportFragmentManager().beginTransaction()
.replace(R.id.main_frame_fragment_container, mItemDetailsFragment).addToBackStack(null).commit();
}
Также я сохраняю и восстанавливаю состояния фрагментов, чтобы мои данные не исчезали после поворотов. Как правило, этот код работает правильно в моем случае.
2) Я использую 2 вида деятельности и одинаковый макет для 1-го портретного и ландшафтного режимов.
XML-макет такой же, как и в предыдущем для ландшафта:
OnCreate метод (обратите внимание, что фрагменты сущностей не являются статичными, как это было в первом случае): private ItemsFragment mItemsFragment; приватный ItemDetailsFragment mItemDetailsFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
mItemsFragment = ItemsFragment.newInstance();
mItemDetailsFragment = ItemDetailsFragment.newInstance();
getSupportFragmentManager().beginTransaction().replace(R.id.main_frame_fragment_container_left, mItemsFragment)
.commit();
getSupportFragmentManager().beginTransaction()
.replace(R.id.main_frame_fragment_container_right, mItemDetailsFragment).commit();
}
}
И теперь, если устройство находится в портретном режиме, я запускаю новую активность:
if (isLandscape()) {
Bundle bundle = new Bundle();
bundle.putSerializable(BaseFragment.KEY_BUNDLE_ITEM, response.getItem());
mItemDetailsFragment = ItemDetailsFragment.newInstance(bundle);
getSupportFragmentManager().beginTransaction()
.replace(R.id.main_frame_fragment_container_right, mItemDetailsFragment).commit();
} else {
Intent intent = new Intent(getApplicationContext(), DetailsActivity.class);
intent.putExtra(KEY_ITEM, response.getItem());
startActivity(intent);
}
И, наконец, вторая активностьOnCreate метод:
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
setContentView(R.layout.activity_details);
if (isLandscape()) {
finish();
}
Item item = (Item) getIntent().getExtras().getSerializable(KEY_ITEM);
Bundle bundle = new Bundle();
bundle.putSerializable(BaseFragment.KEY_BUNDLE_ITEM, item);
ItemDetailsFragment mItemDetailsFragment = ItemDetailsFragment.newInstance(bundle);
getSupportFragmentManager().beginTransaction()
.replace(R.id.main_frame_fragment_container, mItemDetailsFragment).commit();
}
Когда устройство поворачивается в альбомный режим, второе действие заканчивается, и я вижу свое первое действие с 2 фрагментами (как и ожидалось).
Вопрос:
В первом случае я сохраняю фрагменты как статические переменные, и поэтомуМеня не волнует, если я изменю состояние 2-го фрагмента в портретном или ландшафтном режимах (используется один и тот же фрагмент). Но я нене думаю, что этоХорошая идея сохранить это как статические поля.
Во втором случае я неt знать, как синхронизировать фрагмент деятельности B (пейзаж) и фрагмент действия B (портрет). Если я что-то изменяю во фрагменте (я имею в виду, кнопку переключения и т. Д.) И поворачиваю устройство, изменения должны быть применены в другом фрагменте.
Как правило, какой случай лучше, и если 2-й, как я могу решить проблему синхронизации? Или, может быть, есть другой более простой способ. Спасибо за чтение, я надеюсь, вы можете помочь мне :)