Сохранить состояние фрагмента при изменении ориентации, но заменить его макет
У меня есть Activity (которая запускает приложение), в которой ViewPager используется как меню навигации между вкладками. Внутри этого ViewPager у меня есть другой тип фрагментов.
В настоящее время я не обращаюсь с изменениями ориентации самостоятельно, поэтому Activity заново создается, пока я вращаю свое устройство. (Которые ведут себя довольно хорошо, но я не собираюсь снова загружать всю активность из-за длительного времени загрузки и плохого пользовательского опыта).
Для конкретного фрагмента у меня есть 2 макета (один для портрета и один для ландшафта).
Что мне нужно, это сохранить состояние активности и фрагмента, но заменить макет фрагмента при изменении ориентации. Моя проблема в том, что он имеет дополнительные виды в альбомной компоновке, чем в портретной, поэтому я не знаю, как с этим справиться.
Я пробовал configChanges, но, очевидно, это не меняет мой макет. Я попытался раздуть портретную и альбомную компоновки и заменить их внутри контейнера FrameLayout в onConfigurationChanged, но, похоже, он тоже не работает.
Как я могу справиться с ситуацией, когда мне нужно загрузить другой макет, не трогая состояние фрагмента? Это вообще возможно? Каков правильный подход для такого рода вещей?
1 ответ
У меня есть такая ситуация, чтобы загрузить другой макет при изменении ориентации экрана через метод setLayout;
public class SampleFragment extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mRoot = inflater.inflate(R.layout.fragment_layout, null);
return mRoot;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
this.init();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
this.setLayout();
}
private void init() {
this.setLayout();
}
private void setLayout() {
View view = null;
int orientation = mResources.getConfiguration().orientation;
if (orientation == Configuration.ORIENTATION_LANDSCAPE)
view = mInflater.inflate(R.layout.segment_dettaglio_evento_land, null);
else if (orientation == Configuration.ORIENTATION_PORTRAIT)
view = mInflater.inflate(R.layout.segment_dettaglio_evento, null);
if (orientation == Configuration.ORIENTATION_LANDSCAPE || orientation == Configuration.ORIENTATION_PORTRAIT) {
ViewGroup viewGroup = (ViewGroup) mRoot.findViewById(R.id.dettaglio_evento_root);
viewGroup.removeAllViews();
viewGroup.addView(view, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
this.initComponent();
}
}
private void initComponent() {
if (mResult == null)
retrieveData();
else
populateWithDetail();
}
}
fragment_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/dettaglio_evento_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/dettaglio_evento_background"
android:orientation="vertical" >
</LinearLayout>
У меня также есть переменная mResult, которая содержит данные, хранящиеся в сетевом запросе, поэтому, если она пуста, я делаю запрос, в противном случае заполняю представления.